基本的にプラグインであるアプリケーション環境があります。
ホストアプリケーションは、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が存在するディレクトリのパス変数をシステムで成功しないように設定しました。