问题(简化以使事情更清楚):
-
1. 有一个静态链接的 static.lib,它有一个递增的函数:
extern int CallCount = 0;
int TheFunction()
{
void *p = &CallCount;
printf("Function called");
return CallCount++;
}
2. static.lib 链接到一个托管的 C++/CLI managed.dll 中,它包装了 TheFunction 方法:
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
}
问题:
根据我在 Don Box 的 Essential .NET Vol1 The CLR 中所读到的内容,我希望 val2 为零,因为在调用 CreateInstanceAndUnwrap 时会加载 managed.dll/static.lib 的全新副本。我误解了正在发生的事情吗?静态库似乎不尊重 appdomain 边界,因为它是非托管代码。除了创建一个用于实例化托管的全新流程之外,还有其他方法可以解决此问题吗?
非常感谢大家!