問題(わかりやすくするために簡略化):
-
1.インクリメントする関数を持つ静的にリンクされた static.lib が 1 つあります。
extern int CallCount = 0;
int TheFunction()
{
void *p = &CallCount;
printf("Function called");
return CallCount++;
}
2. static.lib は、TheFunction メソッドをラップするマネージド C++/CLI managed.dll にリンクされます。
int Managed::CallLibFunc()
{
return TheFunction();
}
3. テスト アプリには managed.dll への参照があり、C++/CLI ラッパーを呼び出す複数のドメインを作成します。
static void Main(string[] args)
{
Managed c1 = new Managed();
int val1 = c1.CallLibFunc();
// value is zero
AppDomain ad = AppDomain.CreateDomain("NewDomain");
Managed c = ad.CreateInstanceAndUnwrap(a.FullName, typeof(Managed).FullName) as Managed;
int val2 = c.CallLibFunc();
// value is one
}
質問:
Essential .NET Vol1 The CLR by Don Box で読んだ内容に基づいて、CreateInstanceAndUnwrap が呼び出されたときに managed.dll/static.lib の新しいコピーが読み込まれるため、val2 はゼロであると予想されます。何が起こっているのか誤解していますか?静的ライブラリは管理されていないコードであるため、appdomain の境界を尊重していないようです。Managed をインスタンス化するためのまったく新しいプロセスを作成する以外に、この問題を回避する方法はありますか?
皆様、本当にありがとうございました!