来自托管库的调用之间本机库中静态变量的值
Value of static variable in native library between calls from managed library
我管理过用 c# 编写的 Web 应用程序(来自 IIS、FWIW 的 WCF 服务 运行)。在某些情况下,它会调用非托管 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
}
我的问题是:它是否按预期工作?我错过了什么吗?我如何 "remember" 调用之间的变量值?
编辑:实际上我在 IIS 的同一个应用程序池中有 2 个 Web 应用程序 运行。所以看起来这两个应用程序虽然 运行 在同一个 IIS 工作进程中,但每个应用程序都加载了我的 DLL 的不同实例。所以这两个实例中的静态变量是无关的。现在我的(更新的)问题是:如何让这两个应用程序共享本机 DLL 的实例?而且 - 同一个工作进程怎么会同时加载 2 个 DLL 副本?
经过一些研究,我发现问题出在同一个应用程序池中的多个 Web 应用程序 运行。尽管 IIS 对所有应用程序使用相同的工作进程,但它似乎以某种方式为每个具有不同句柄和不同静态变量集的应用程序创建了不同的非托管 dll 副本。这就是它们被重新初始化的原因。
我管理过用 c# 编写的 Web 应用程序(来自 IIS、FWIW 的 WCF 服务 运行)。在某些情况下,它会调用非托管 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
}
我的问题是:它是否按预期工作?我错过了什么吗?我如何 "remember" 调用之间的变量值?
编辑:实际上我在 IIS 的同一个应用程序池中有 2 个 Web 应用程序 运行。所以看起来这两个应用程序虽然 运行 在同一个 IIS 工作进程中,但每个应用程序都加载了我的 DLL 的不同实例。所以这两个实例中的静态变量是无关的。现在我的(更新的)问题是:如何让这两个应用程序共享本机 DLL 的实例?而且 - 同一个工作进程怎么会同时加载 2 个 DLL 副本?
经过一些研究,我发现问题出在同一个应用程序池中的多个 Web 应用程序 运行。尽管 IIS 对所有应用程序使用相同的工作进程,但它似乎以某种方式为每个具有不同句柄和不同静态变量集的应用程序创建了不同的非托管 dll 副本。这就是它们被重新初始化的原因。