C#とC++/CLI C DLLます。IO.FileNotFoundException
-
22-07-2019 - |
質問
なってい System.IO.FileNotFoundException: The specified module could not be found
実行する場合のC#コード、C++/CLI組み立てられる、純粋なC DLL.そういうことであり、オブジェクトのインスタンスが生成される、純粋なC DLLます。
BackingStoreが純粋なCCPPDemoViewModelはC++/CLI呼び出しBackingStoreが参BackingStore.
また最も簡単な場合は新C#単体テストプロジェクトで作成しようとし、オブジェクトで定義されCPPDemoViewModel.私は追加の参照からのC#プロジェクトをCPPDemoViewModel.
C++/CLI試験プロジェクトでの作品から追加されたrefをCPPDemoViewModelので何かというとの間の言語である。
を使用していVisual Studio2008SP1ます。純3.5SP1.私はビルビスタx64っての注意を払っていないかを確認し台目標を設定しx86.
この感じもの愚かさを明らかい足するとともに愚かなのに廃棄物とこれを解決するためには、民間でうと疑問に思っていましたら恥ずかしい?
この試験のためのプロジェクトの移植には大量のCコード私をDLLとViewModel実施したC++/CLIを起動します。
編集 確認後、ディレクトリにできることを確認しBackingStore.dll れていないコピーされます。
私は、標準的なプロジェクトフォルダが作成された典型的なマルチプロジェクト。
WPFViewModelInCPP BackingStore CPPViewModel CPPViewModelTestInCS bin Debug Debug
高レベルのデバッグが表示される共通フォルダのCおよびC++/CLIプロジェクトにより、私は驚きです。
WPFViewModelInCPP\デバッグを含むBackingStore.dll,CPPDemoViewModel.dll,CPPViewModelTest.dll と関連している。ご応募す。pdbファイル
WPFViewModelInCPP\CPPViewModelTestInCS\bin\デバッグを含むCPPDemoViewModelとCPPViewModelTestInCS.dllます。pdbファイルが ない BackingStore.しかし、手動でコピー BackingStoreがディレクトリ を修正しませんでした、エラーとなります。
CPPDemoViewModelに 地元のコピー セットあるいはコピーそのDLLがだされます。できない追加の参照からのC#プロジェクトへの純粋なC DLLって見積書や請求書を発行するsaas への参照をバッキングストアが追加されます。
なんなのかしている場合は一つだけの問題です。
使用できます、昔ながらのコピーを構築ステップをコピーするBackingStore.dll いずれのC#プロジェクトのディレクトリがったのです。純モデルになる。
DependencyWalkerが聞かせていただきましては、欠ファイルGPSVC.dll る ることが示唆されている 表示セキュリティ設定の課題です。これは赤ニシン.
edit2 マニュアルのコピー BackingStore.dll れに隣接する実行ファイルは、GUI作。C#の試験プロジェクトは依然として問題あるいは、実行環境の試験プロジェクトから出ない人も結構多いですがなる。
解決 2
その答えのためのGUI以外の変更の出力設定に、前のステップの構築
copy $(ProjectDir)..\Debug\BackingStore.* $(TargetDir)
その答えのための試験プロジェクトの追加、DLLへの展開がタブのtestrunconfig.まいを直接編集、デフォルトの LocalTestRun.testrunconfig (表示され溶液の溶液品)または右クリックし情報セキュリティーコン新しく試運転config、その後に表示される日本文化体験メニューです。
の答え この質問 試験構成に導いたと言えるのでしょうか。
他のヒント
CおよびC ++ DLLは、実行中のC#アセンブリと同じディレクトリにありますか?
プロジェクトの出力設定を変更して、C#アセンブリと他のDLLがすべて同じフォルダーに配置されるようにする必要がある場合があります。
このような場合、 Dependency Walker をよく使用します。すべての依存関係を実際に見つけることができることを示す健全性チェックです。
アプリを実行したら、プロセスモニター実行中のコードで、どのDLLが参照されているか、どこにあるかを確認します。
これが発生する理由は、CRTを初期化する前に、マネージコードからDLLMAINを読み込むためです。マネージコードがない場合、DllMain通知の効果から直接または INDERECTLY 実行されます。 (参照:エキスパートC ++ / CLI:Visual C ++プログラマ向け.Net、第11章++)。
または、ネイティブエントリポイントが定義されていませんが、MSVCRTにリンクしています。 CLRは/ clrを使用して自動的に初期化されます。この詳細は多くの混乱を招くため、考慮する必要があります。混合モードDLLは、クラス内のすべてのマネージエントリポイントvtableのホットパッチを使用して、実際にCLRを遅延ロードします。
このトピックを取り巻くクラスの初期化の問題の多くは、ローダーのロックとCLRの読み込みの遅延が少し難しい場合があります。グローバルの静的を宣言し、#pragma managed / unmanagedを使用せずに、/ clr per-fileでコードを分離してください。
マネージコードからコードを分離できず、問題が発生している場合(これらの手順の一部を行った後)、CLRを自分でホストし、おそらくドメインマネージャーを作成する作業を検討することもできます。これにより、完全な「インザループ」が保証されます。ランタイムイベントとブートストラップの。
これがまさにその理由です。検索パスや初期化に何の問題もありません。残念ながら、Fusionログビューアはそれほど役に立ちません(依存関係ウォーカーではなく、.NET CLRアセンブリバインディングの問題を探す通常の場所です)。
静的にリンクすることも、これとは何の関係もありません。混合モードのC ++ / CLIアプリケーションを NOT 静的にリンクすることはできません。
- DLLMAIN関数を単独でファイルに配置します。
- このファイルがビルドオプション(ファイルビルドオプション)で / CLR を設定していないことを確認します
- / MDまたは/ MDdとのリンク、およびLINKするすべての依存関係が、まったく同じCRTを使用していることを確認してください。
- / DEFAULTLIBおよび/ INCLUDEのリンカーの設定を評価して、参照可能な問題を特定し、コードでプロトタイプを宣言し、/ INCLUDEを使用してデフォルトのライブラリリンク解決をオーバーライドできます。
幸運を祈ります。非常に良い本であることも確認してください。
これは興味深いジレンマです。以前にC#から呼び出した後、C ++ / CLIからネイティブ.DLLをロードする問題を聞いたことはありません。問題は @Daniel L が提案し、アセンブリローダーが見つけることができるパスに.DLLが存在しないことを示しました。
ダニエルの提案がうまくいかない場合は、可能であれば、ネイティブCコードをC ++ / CLIプログラムに静的にリンクすることをお勧めします。 .DLLはC ++ / CLI .DLLに完全に吸収されるため、これで問題は確実に解決されます。
ターゲットシステムに正しいMS Visual Cランタイムがあり、デバッグランタイムで誤ってC dllをビルドしていないことを確認してください。
64ビットVistaへの切り替えで同じ問題が発生しました。私たちのアプリケーションは、アプリケーションのターゲットビルドを混乱させていたWin32 DLLを呼び出していました。解決するために、次のことを行いました。
- プロジェクトのプロパティに移動します。
- 「ビルド」タブを選択します。
- 「プラットフォームターゲット:」オプションをx86に変更します。
- アプリケーションを再構築します。
アプリケーションを再実行したときに機能しました。