マネージ C++ ラッパーを介して C# コードを呼び出すアンマネージ C++ DLL があります。アンマネージド c++ DLL は、一部のアプリケーション (私の制御外) のプラグインです。このアプリケーションがアンマネージ C++ DLL を呼び出すと、マネージ C++ コードが C# コードを使用しようとするまで、すべて正常に動作します。その後、クラッシュします。
アプリケーションと同じことを行うテスト アプリケーションを作成しました。つまり、アンマネージ c++ DLL を呼び出します。これはうまくいきます。
コードは可能な限り単純です。
アンマネージ C++:
extern "C" __declspec(dllexport) void UnmanagedMethodCalledUponByApplication()
{
new Bridge();
}
マネージ C++:
Bridge::Brigde()
{
gcnew Managed(); // This line crashes
}
c#:
public class Managed
{
}
問題のある行の周りに try-catch (...) ブロックを追加しようとしましたが、エラーをキャッチしません。
gcnew Managed();
行を置き換えると、正常にMessageBox::Show("Alive!");
動作します。私の推測では、C# プロジェクトの設定に問題があると思われます。
さまざまなプラットフォーム (任意の CPU および x86) でコンパイルしようとしました。ターゲット フレームワークを変更しようとしました。Managed
を使用する代わりに、静的メソッドを呼び出そうとしましたgcnew
。まだクラッシュしています。
何が問題なのですか?
アップデート:
コメントと回答でアドバイスした後、デバッガーを添付しました。System.IO.FileNotFoundException
マネージ DLL (またはその依存関係の 1 つ) が見つからないというメッセージが表示されるようになりました。
推測は次のとおりです。DLL は一緒に配置されますが、現在のディレクトリには配置されていません。アンマネージ c++ DLL は、メイン アプリケーションがそのパスを指定するため、正しくロードされます。マネージ C++ は実際には lib であるため、コードも正常に機能します。しかし、マネージ C++ が c# DLL をロードしようとすると、間違ったディレクトリで検索されます。
アップデート:
これを修正する方法は、リフレクションを使用して c# DLL を動的にロードすることです。