2012-07-31 3 views
0

IIS7에서 별도의 응용 프로그램 풀에서 실행되는 두 개의 웹 서비스가 있습니다. 웹 서비스는 동일합니다. 차이점은 테스트 데이터베이스와 라이브 데이터베이스에 연결된다는 점입니다.IIS7에서로드하는 동적 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을로드하지 못하고로드하는 첫 번째 웹 사이트는 정상적으로 실행됩니다.

// 편집 --------------------------------- 이상한 점은 동일한 DLL이 그러나 각 웹 사이트에서이 문제가 발생하지만 두 사이트를 동일한 DLL에 연결하면 모든 것이 정상적으로 작동합니다.

이것에 대한 통찰력이 있습니까?

+0

소리가 DLL 문제와 유사합니다. 말하기 힘듭니다. 일부 진단을 추가하고 어떤 호출이 실패했는지 ('LoadLibrary'인지) 그리고 오류 코드가 무엇인지 찾아야합니다. p/invokes에'SetLastError = true'가 필요합니다. –

+0

DLL이 잠금 가능한 리소스 (로깅을 위해 디스크의 파일 등)를 사용하고있을 가능성이 있습니까? 이 문제를 진단하려면 오류 메시지가 필요합니다. –

답변

0

IIS는 각 프로세스를 별도의 응용 프로그램 풀에서 실행해야 IIS가 자체 프로세스에서 각 사이트를 실행해야합니다.

+0

다른 앱에서 이미 실행 중입니다. – Jonny

관련 문제