我有用C#編寫的託管Web應用程序(從IIS,FWIW運行的WCF服務)。在某些情況下,它會從非託管c/C++庫執行對函數的調用。 在非託管庫內部我有一些全局靜態變量。 我發現有些時候,這個變量的值會在調用之間更改爲其初始值,而我期望它始終保持其值。 的結構是這樣的:本地庫中靜態變量的值來自託管庫的調用
Managed.cs
public class Managed
{
[DllImport("native.dll", EntryPoint = "[email protected]@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
}
我的問題是:它的工作原理爲咋辦?我錯過了什麼嗎?如何「記住」調用之間的變量值?
編輯:其實我有2個Web應用程序在IIS中的同一個應用程序池中運行。所以它看起來像這兩個應用程序在同一個IIS工作過程中運行,每個應用程序加載我的DLL的不同實例。所以這兩個實例中的靜態變量是無關的。現在我的(更新的)問題是:我怎樣才能讓這兩個應用程序共享本地DLL的實例?還有 - 同一個工作進程如何同時加載2個DLL副本?
是否所有調用都來自同一個線程? –
一般不會。但對MyWrapper的調用是在內部鎖定的,所以我可以確定沒有併發。另外,我在測試服務器上檢查了這個作爲唯一調用者的行爲是一樣的。 – Grisha
因此,看起來本地DLL正在調用之間卸載?你可以確認,在DllMain中進行一些調試嗎? –