10

ソリューションをMSVS2005からMSVS2012に移植しています。プロジェクトはC++.NETですが、自家製のネイティブC++ライブラリも使用しています。2005でプロジェクトをビルドするのに問題はありませんでしたが、現在、2012を使用してプロジェクトをビルドできません。次のエラーメッセージが表示されます。

MyFile.obj:エラーLNK2022:メタデータ操作に失敗しました(801311E4):重複する管理対象タイプには異なる可視性があります。

これは何を意味するのでしょうか?あなたは私を助けるためにどのような情報が必要ですか?

ご協力いただきありがとうございます?

4

5 に答える 5

8

バグを見つけました。これは、ここで提案されているすべてのものの組み合わせです。

プロジェクトのどこかに、ネイティブC++ヘッダーファイルが含まれています。このファイルのクラスは、次のように公開されます。

#include "File_Where_ClassName_Is_Defined.h"
#pragma make_public( ClassName )

しかし、私自身のコードには、作成されたパブリッククラスが定義されているヘッダーを含む2番目のヘッダーを含めています。したがって、この時点で、クラスは1つのファイルで「公開」され、同じプロジェクトの別のファイルで「非公開」になります。「異なる可視性を持つ複製」はそこから来ています。

間違ったパスに私を送った唯一のポイントは、エラーメッセージでした:「重複した管理対象タイプは異なる可視性を持っています」。しかし、ここでは、それは管理されていないタイプです。

したがって、いつかこのエラーが発生した場合は、プロジェクトで#pragma make_public(...)を探してから、問題のあるファイルに重複して含まれているものを探してください。

于 2012-10-01T17:20:06.983 に答える
4

私は同じ問題を抱えていて、実際にdom_beauの回答に記載されているのと同じ状態だったので、私も同じ根本的な原因を持っていたと確信しています。ただし、エラーを解決できるようにするには、実際の問題のあるクラスを見つける必要がありました(いくつかあり、エラーメッセージはそれらを見つけるのにほとんど役立ちません!)。

そこで、可視性が競合する複数の*.objファイルで定義されているすべてのクラスを検索する次のLINQクエリを作成しました。誰かに役立つかもしれないので、ここに投稿します。

// Analyze text files produced by ildasm when given *.obj files.
// Use "for %1 in (*.obj) do ildasm /text %1 > %1-ildasm.txt" to produce the files.

from file in Directory.GetFiles(@"your project's intermediate folder")
where file.EndsWith("-ildasm.txt")
let lines = File.ReadAllLines(file)
from i in Enumerable.Range(0, lines.Count() - 1)
where lines[i].Contains("TypDefName:")
let type = lines[i].Substring(16,lines[i].IndexOf(" (")-17)
let flags = lines[i+1]
group new {file, flags} by type into g
where g.Select(t=>t.flags).Distinct().Count() > 1
select g
于 2013-05-13T15:58:43.937 に答える
3

Microsoftは、修正プログラムでこの問題を修正しました:KB2848798

VS2010ソリューションをVS2012に移行するのに役立ちました。

こちらからダウンロードできます

上記のホットフィックスリンクからの関連する詳細:CLR問題1

症状

Microsoft VisualStudio2010からVisualStudio2012にアップグレードした後、一部のC ++ / CLIプロジェクトはビルドできず、次のようなリンカーエラーが報告されます。

MSVCMRTD.lib(mstart.obj):エラーLNK2022:メタデータ操作に失敗しました(801311E4)

于 2013-09-13T15:13:03.617 に答える
1

VS2008からVS2012へのアップグレードでも同じ問題が発生しました。私にとっての修正プログラムの代替ソリューションは、

#pragma make_public( ClassName )

これまでの.cppファイルからstdafx.hへのステートメント。

于 2013-09-29T15:42:34.977 に答える
1

Win2008R2マシン(Win8.1では完全に正常にコンパイルされた)でVC++2013プロジェクトをコンパイルしようとしても同じ問題が発生しました。重複する#includeを削除するだけでは、問題は解決しませんでした。

ただし、プリコンパイル済みヘッダーを有効にして、そのプロジェクトのすべての make_public()ステートメントをstdafx.hに移動しました。これで、ようやく完了しました。

于 2014-12-10T10:32:12.250 に答える