我已经用c#编写了管理web应用程序(从IIS运行的WCF服务,FWIW)。在某些情况下,它执行对非托管c/c++库中函数的调用。在非托管库中,我有一些全局静态变量。我看到,有时这个变量的值在调用之间会更改为其初始值,而我希望它始终保持其值。结构是这样的:
Managed.cs
public class Managed
{
[DllImport("native.dll", EntryPoint = "?MyFunc@@YGXXZ", ExactSpelling = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
static extern void MyFunc();
public void MyWrapper()
{
MyFunc();
}
}
}
Native.cpp
static int counter = -1;
__declspec(dllexport) void __stdcall MyFunc()
{
counter++; // sometimes when I enter this function the counter drops to -1
}
我的问题是:它能按预期工作吗?我是不是错过了什么?如何在调用之间"记住"变量的值?
编辑:实际上,我有两个web应用程序在IIS的同一个应用程序池中运行。因此,看起来这两个应用程序在同一IIS工作进程中运行时,每个应用程序都加载我的DLL的不同实例。因此,这两个实例中的静态变量是不相关的。现在我的(更新的)问题是:如何使这两个应用程序共享本机DLL的实例?而且,同一个工作进程怎么可能同时加载两个DLL副本?
经过一番研究,我发现问题出在同一应用程序池中运行的多个web应用程序上。尽管IIS对所有应用程序使用相同的工作流程,但它似乎以某种方式为每个具有不同句柄和不同静态变量集的应用程序创建了不同的非托管dll副本。这就是它们被重新初始化的原因。