0

基本的にプラグインであるアプリケーション環境があります。

ホストアプリケーションは、C#dllを呼び出すマネージC++dllを呼び出すアンマネージC++dllを呼び出します

これは、マネージC ++のブリッジを使用して、アンマネージC ++からC#を呼び出すよく知られた方法です。これはすべて、私のdll(アンマネージC ++、マネージC ++、およびC#)がdllを呼び出すアプリケーションと同じディレクトリにないプラグインタイプのアーキテクチャを除いて、ほとんどの状況でうまく機能します。アプリケーションがアンマネージC++を呼び出す場合、アプリはそのdllをロードするために呼び出すディレクトリを認識しているため、すべてが正常に機能します。ただし、アンマネージC++がマネージC++を初めて呼び出すと、FileNotFoundExceptionが発生します。C#dllが見つからないことが判明しました(3つのdllはすべて同じディレクトリにあり、appディレクトリにはないことに注意してください)。すべてのdllをexeのランタイムディレクトリにドロップすると、すべてが完全に機能し、FileNotFoundExceptionが発生しません。

したがって、問題は、マネージC ++ dllがロードされたときに、アンマネージC ++コードでC#dllのロードディレクトリをプログラムで設定するにはどうすればよいかということです。SetDllDirectoryを試し、dllが存在するディレクトリのパス変数をシステムで成功しないように設定しました。

4

1 に答える 1

1

CLRは、デフォルトでアセンブリを2か所で検索します。最初にGAC、2番目にEXEが開始されたディレクトリです。他の場所で見せるには、追加の作業が必要です。1つの可能性はテーブルから外れており、このシナリオではAppDomain.AssemblyResolveのイベントハンドラーをサブスクライブできません。<probing>これにより、または<codebase>要素を含むapp.exe.configファイルが残ります。アンマネージEXEと同じ名前を付け、EXEと同じフォルダに保存する必要があります。

EXEが自分のものではなく、EXEディレクトリにデータを入れないという目標に正確に対応していない場合、これは賢明ではない傾向があります。GACは簡単な回避策です。

于 2013-02-23T05:03:53.517 に答える