C++/CLIで,ネイティブ関数→同じアセンブリ内のマネージド関数→参照アセンブリ内のマネージド関数という順で呼んでいたのですが。
#pragma managed(push,off)
void MyNativeFunction()
{
MyManagedFunction()
}
#pragma managed(pop)
void MyManagedFunction()
{
try
{
MyManagedDllClass::AFunction();
}
catch (System::Exception^ e)
{
ShowError(e);
}
}
MyManagedDllClassの格納されているアセンブリ(ここではMyManaged.dllとします)はプログラム起動時には読み込まれず,必要なときに動的に読み込まれるのですが,MyManaged.dllが存在しない状態でプログラムを起動しようとすると(まあつまりインストーラに組み込み忘れたってことですが)いきなりプログラムが落ちてしまっていました。try/catch書いてるのになんでだ! とびっくりしたのですが,MyManaged.dllはMyManagedDllClass::AFunction()が呼ばれる直前ではなくMyManagedFunction()が呼ばれる直前に読み込まれるのですね。そこで
#pragma managed(push,off)
void MyNativeFunction()
{
MyManagedFunction()
}
#pragma managed(pop)
void MyManagedFunction()
{
try
{
MyManagedFunctionIntenal();
}
catch (System::Exception^ e)
{
ShowError(e);
}
}
void MyManagedFunctionIntenal()
{
MyManagedDllClass::AFunction();
}
としてやったところ,MyManaged.dllが存在しなければSystem.IO.FileNotFoundExceptionがちゃんとcatchされるようになりました。