2009-09-03 11 views
0

私はネイティブC++、およびC++/CLIでビルドされたプロジェクトを持っています。 アセンブリから.NETシンボルが消える

 
Assembly A (C++/CLI) 
| uses 
Assembly B (C++/CLI) 
| uses 
Static Lib C (Native C++) 

が、私は静的のLib Cの主要な再書き込みをした、そしてそれはコンパイルして、それを使用する他のネイティブのプロジェクトが同様に罰金コンパイル:私は、次のコンポーネントがあります。アセンブリBは再書き込みで変更されませんでした。アセンブリBをコンパイルすると、エラーや警告なしで正常にコンパイルされます。しかし、アセンブリAをコンパイルしようとすると、アセンブリBで使用可能と思われるシンボルが見つからず、何百ものエラーが発生します。私は運がないAプロジェクトの参考文献としてBとCを追加して削除しようとしました。私はきれいにして、一からすべてを再構築しようとしました - しかしまだ運がありません。私はアセンブリBをRedGateのリフレクタにロードしました。シンボルを見ることができないので、少なくとも一貫しています。私はブランチで作業しているので、トランクからアセンブリBの以前のバージョンをロードしました(そして、私がブランチからロードした以前のバージョンをアンロードするように頼んだ)、その中のすべてのシンボルを見ることができました。ですから、反射板のアセンブリBの私の現在のバージョンを見ると、私は参照してください:

 
+TFModelSetNETD, Version=1.0.3532.42171, Culture=neutral, PublicKeyToken=null 
    +TFModelSetNETD.dll 
    + References 
     + {} - 
     + <CppImplementationDetails> 
     + <CrtImplementationDetails> 
     + vc_attributes 

それだけです。古いバージョンでは、これらの4つのエントリと、Assembly B、Static Lib C、他のlibs、いくつかのboostとstdの名前空間で宣言されたすべての名前空間を参照しています。私はこれがVisual Studio 2008であることを言及する必要があります。

ここで何が起こっているかについてのアイデアはありますか?コンパイラにシンボルをエクスポートしないようにするために何ができたのか理解できず、警告を出すことはできません。

アイデア、ヒント、またはデバッグのアドバイスはすべて大変ありがとうございます。

編集:静的リブCをLibDumpにロードしましたが、すべてのシンボルがありますが、アセンブリBで定義されたシンボルもスタティックLib Cから参照されるシンボルもアセンブリBでは表示されませんレッドゲートリフレクター。

+0

AとBはdllかそうですか? – Lodle

+0

同じアセンブリの最新の.vcprojファイルに対して、アセンブリBの以前の.vcprojファイルのコピーをチェックアウトする方法はありますか?これらのファイルは、多少人間が読めるだけで、プロジェクトのフラグ/オプションが誤って切り替えられた可能性があります。 – reuben

+0

Lodle:AとBは両方ともDLLです Reuben:良い提案!私はこれを試しました。ヘッダーとcppファイルのセクションにはたくさんの差分がありますが、1)私のprojがUnicodeに設定されていて、それ以外のものはすべてMBCSであり、 "ShowIncludes"新しいプロジエクトにShowIncludes = falseがありました。私はチャーセットをMBCSに戻し、清掃してビルドしましたが、喜びはありません。 あなたのコメントをありがとう! –

答えて

0

問題のシンボルのヘッダーファイルが、どこのcppファイルにも含まれていないということが起こりました。なぜ私はそれがうまくいったのかという唯一の説明は、他のコンパイル単位の1つに間接的にヘッダーが含まれていた可能性があるということですが、書き換えによって変更されたとき、シンボルはどこにも含まれなくなりました。 DLLの初期化とスレッドローカルストレージに関連する競合のために、アセンブリがロード時に例外をスローする原因となる次の1つのboost :: threadと比較して、この問題は簡単かどうかは分かりません。

関連する問題