2012-09-28 6 views
9

私はMSVS2005からMSVS2012へのソリューションを移植しています。プロジェクトはC++ .NETにありますが、手作りのネイティブC++ライブラリも使用しています。MSVS 2012のLNK2022(重複する管理対象タイプは異なる可視性を持っています)

MyFile.obj:エラーLNK2022:メタデータ操作が失敗しました(801311E4):重複して管理されています(801311E4):2005年にプロジェクトを構築する際に問題はありませんでしたが、2012年を使用してプロジェクトを構築できません。タイプは異なる可視性を有する。

これはどういう意味ですか?私を助けるのにどんな情報が必要ですか?

ありがとうございます。

+0

複数の.cppファイルのrefクラス宣言を含む#hファイルから#を重複して取得することができます。リンカーは、正確に一致しないと転倒します。 1つはパブリックと、もう1つはパブリックのように。 –

+0

すみません、私は完全に理解できません。多くのソースファイルに含まれるヘッダーは、**同じ**コードなので、refクラスを別の方法で宣言できますか? –

+0

私は分かりません、私はここからあなたのコードを見ることができません。マクロは常にランダムな損失を引き起こす良い方法です。 –

答えて

7

このバグが見つかりました。ここに示唆されているすべてのものを組み合わせたものです。

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

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

しかし、私自身のコードでは、私は自分自身が作ったpublicクラスが定義されているヘッダを含む第2のヘッダが含まれます。したがって、この時点で、クラスは同じプロジェクト内の別のファイルに「ではなく、公開されました」と公開されました(は公開されました)。そこから、 "異なる視点の複製"が生まれます。

誤ったパスで私を送った唯一のポイントは、「重複した管理対象タイプには異なる可視性があります」というエラーメッセージでした。しかしここでは、アンマネージドタイプです。

したがって、このエラーが発生した場合は、#pragma make_public(...)をプロジェクト内で探して、問題のあるファイルに重複したインクルードを探します。

+0

すごい!!私はまずこれをロングショットだと思って読んだが、私はまさにこの問題を抱えていた。私は 'make_public'を使って、アンマネージクラスを(C#コードへの)アクセスできない管理クラスに変換していました。プラグマをメインのインクルードファイルに移動すると、私のためにそれが解決されました。私より先にこの1つをトリップしてくれてありがとう! –

3

私は同じ問題を抱えていましたが、実際には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 
+0

+1:ildasmとLINQに慣れていない人には多くの仕事のように見えましたが、うまくいきました。同じシナリオで実行され、クエリは問題のクラスを指していました。不足しているmake_publicプラグマを追加して正常にビルドしました。 –

+0

そのソリューションは私にとって完璧に機能しました。 LINQクエリではLINQPadを使用しました。 –

3

マイクロソフトでは、この問題を修正プログラム:KB2848798で修正しました。

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

あなたはダウンロードすることができ、それhere

修正プログラム上記のリンクから

関連詳細: CLRの問題1

症状

は、Visual Studioの2012年にマイクロソフトのVisual Studio 2010からアップグレードした後、いくつかのC++/CLIプロジェクトはビルドできず、次のようなリンカーエラーが報告されます。

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

+0

VS2013アップデート2に戻ってくるようです。RC –

1

同じ問題がVS2008からVS2012にアップグレードされていました。 私のための修正プログラムの代替ソリューションは、それがSTDAFX.Hまで今までだった.cppファイルから

#pragma make_public(ClassName) 

文を移動することでした。

1

Win2008R2マシン(Win8.1で絶対にコンパイルされた)でVC++ 2013プロジェクトをコンパイルしようとして同じ問題が発生しました。重複を取り除くだけでを含めても問題は解決しませんでした。

はしかし、私は、プリコンパイル済みヘッダーを有効にしてを移動し、そのプロジェクトのすべてのmake_public()文をstdafx.hをするために、それは最終的にそれをやりました!

+0

私のために働きました。簡単なソリューション –

関連する問題