2つのDLL unmanage.dllとmanage.dllがあります。
unmanage.dllは非CLRで、manage.dllは/CLRでコンパイルしてあります。
環境はVC2008です。
unmanage.dllの関数をmanage.dllから呼び出しています。
unamnage.dll側
Code Snippet
class MyEx{...};
class MyData{...};
void Func()
{
try{
...
}catch(...){
MyData data;
...
throw MyEx;
}
}
この関数Func()をmanage.dll側から呼びます
manage.dll側
Code Snippet
void FuncCall()
{
try{
Func();
} catch (MyEx& e){
...
}
}
こうすると、unmanage.dll側のFunc()のtryブロック内で例外が発生したとき、catchブロック内のMyData dataオブジェクトのデストラクタが呼ばれません。FuncCall()側でcatchはできているのですが、その際dataのデストラクタが呼ばれないのです。
しかも、manage.dllを非clrでコンパイルすると、dataのデストラクタが呼ばれます。
manage.dllを/clrでコンパイルすると、dataのデストラクタが呼ばれないのはなぜでしょう。