2015-12-08 34 views
0

我有用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副本?

+0

是否所有調用都來自同一個線程? –

+0

一般不會。但對MyWrapper的調用是在內部鎖定的,所以我可以確定沒有併發。另外,我在測試服務器上檢查了這個作爲唯一調用者的行爲是一樣的。 – Grisha

+0

因此,看起來本地DLL正在調用之間卸載?你可以確認,在DllMain中進行一些調試嗎? –

回答

0

經過一番研究,我發現問題出在同一個應用程序池中運行的多個Web應用程序。儘管IIS對所有應用程序使用相同的工作進程,但它看起來像是爲每個具有不同句柄和不同靜態變量集的應用程序創建了不同的非託管dll副本。這就是爲什麼他們重​​新初始化。