3

C#、C++、および C++/CLI プロジェクトを使用したソリューションがあります。具体的には、C++ コア (アンマネージ dll が最大 5 つ)、C++/CLI コア ラッパー、およびプロジェクト固有のビジネス ロジックを備えた C# アセンブリです。

少し前に、VS 2008 フォーム デザイナー (WinForms) がコア ラッパー アセンブリを読み込めないことがあることに気付きました。VS デバッガーと Procmon で数時間過ごした後、ラッパーが依存するアンマネージ ライブラリを解決できないため、VS がアセンブリを読み込めないことがわかりました。VS は、PATH 環境変数からすべてのシステム フォルダーとフォルダーを検索しますが、ラッパー アセンブリが配置されているフォルダーは検索しません。

さらに、1 つのアセンブリに 2 つのフォームがあり、1 つは別のアセンブリから継承されています。VS フォーム デザイナーは親フォームを正常にロードし、継承されたフォームのロードに失敗します。

だから、ここに私の質問があります: 誰かがこの動作の理由を知っていますか?

PS私は回避策を使用しました:プロジェクトバイナリを含むフォルダーをPATH変数に追加しましたが、それでも理由を知りたいです。

4

1 に答える 1

0

バイナリを実行可能フォルダーに入れようとしましたか? .NET は既知のパス ( As path's stored in %PATH% ) と実行可能ファイルのローカル フォルダーのみを検索していると確信しているためです。

これの正確な理由はわかりませんが、これは、DLL がロード元のパスを認識せず (マネージ DLL の do!)、現在のディレクトリと他の既知のパスのみを検索しているためだと思います。

ただし、これには回避策があります。Visual-Studio のスタートアップ実行可能ファイルを作成し、次のいずれかを実行できます。

SetDllDirectory-スニペット:

[DllImport("kernel32.dll", SetLastError = true)]
public static extern Boolean SetDllDirectory(String pathName);
于 2012-10-15T14:06:53.910 に答える