2012-07-31 133 views
0

我們有兩個Web服務在IIS7中的單獨應用程序池上運行。 Web服務是相同的,不同之處在於一個連接到測試數據庫,另一個連接到實時數據庫。IIS7中的動態DLL加載失敗

Web服務需要這是用Delphi編寫的DLL中生產出一些系統所需的業務邏輯,我們使用的是動態加載DLL像這樣裝的:

public static class DynamicLinking 
    { 
     private static int libHandle; 
     private static string dllName; 

     public static void init(String pDllName) 
     { 
      dllName = pDllName; 
      libHandle = LoadLibrary(pDllName); 
     } 

     public static void fini() 
     { 
      FreeLibrary(libHandle); 
     } 

     [DllImport("kernel32.dll", EntryPoint = "LoadLibrary")] 
     static extern int LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpLibFileName); 

     [DllImport("kernel32.dll", EntryPoint = "GetProcAddress")] 
     static extern IntPtr GetProcAddress(int hModule, [MarshalAs(UnmanagedType.LPStr)] string lpProcName); 

     [DllImport("kernel32.dll", EntryPoint = "FreeLibrary")] 
     static extern bool FreeLibrary(int hModule); 

     [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)] 
     delegate bool QryFunction(string domainString, string qryString, 
            int outputStringBufferSize, ref string outputStringBuffer); 
     public static void ExecuteDLLFunction(string pfunctionName, int bufferSize, 
               string pDomain, string inputXMLString, 
               out string outputString) 
     { 

      if (libHandle == 0) 
       throw new Exception(string.Format("Could not load library \"{0}\"", dllName)); 

      var delphiFunctionAddress = GetProcAddress(libHandle, pfunctionName); 
      if (delphiFunctionAddress == IntPtr.Zero) 
       throw new Exception(string.Format("Can't find function \"{0}\" in library \"{1}\"", pfunctionName, dllName)); 

      var queryFunction = (QryFunction)Marshal.GetDelegateForFunctionPointer(delphiFunctionAddress, typeof(QryFunction)); 

      var outputStringBuffer = new String('\x00', bufferSize); 
      var errorMsgBuffer = new String('\x00', bufferSize); 

      if (!queryFunction(pDomain, inputXMLString, 
           bufferSize, ref outputStringBuffer)) 
       throw new Exception(errorMsgBuffer); 

      outputString = outputStringBuffer; 

     } 
    } 

現在的問題在於這裏:當我們啓動網站時,最後一個站點最後開始的網站將無法加載dll,而第一個加載的網站將運行良好。

//編輯--------------------------------- 奇怪的是,當相同的DLL是但是,如果我們將兩個站點鏈接到相同的DLL,一切正常工作

任何有關這方面的見解?

+0

聽起來像是DLL的問題。很難說。您需要添加一些診斷程序,並找出哪個調用失敗(是否是'LoadLibrary'),如果有的話,錯誤代碼是什麼。你需要在你的p/invokes上使用'SetLastError = true'。 – 2012-07-31 13:38:47

+0

DLL正在使用可鎖定資源(磁盤上的文件進行日誌記錄等)的機會?您確實需要一條錯誤消息才能診斷此問題。 – 2012-07-31 15:11:17

回答

0

您應該將每個站點放在一個單獨的應用程序池中,這樣IIS將在其自己的進程中運行每個站點。

+0

他們已經在不同的應用程序中運行 – Jonny 2012-07-31 13:34:13