IIS7中的动态DLL加载失败

时间:2012-07-31 13:30:00

标签: c# iis dll iis-7 dllimport

我们有两个Web服务在IIS7中的不同应用程序池上运行。 Web服务是相同的,不同之处在于,一个连接到测试数据库,另一个连接到实时数据库。

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,一切正常

对此有何见解?

1 个答案:

答案 0 :(得分:0)

您应该将每个站点都放在一个单独的应用程序池中,以便IIS在其自己的进程中运行每个站点。