0

IIS7 の個別のアプリケーション プールで実行されている 2 つの Web サービスがあります。Web サービスは同じですが、1 つがテスト データベースに接続し、もう 1 つがライブ データベースに接続する点が異なります。

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;   

        }
    }

問題はここにあります: Web を開始すると、最後に開始された Web サイトは dll のロードに失敗し、最初にロードされた Web サイトは正常に実行されます。

//編集------------------------------------------------ 奇妙なのは、同じ DLL が各 Web サイトにコピーされると、これが問題が発生しますが、両方のサイトを同じ DLL にリンクすると、すべて正常に動作します

これに関する洞察はありますか?

4

1 に答える 1

0

IISが独自のプロセスで各サイトを実行できるように、各サイトを個別のアプリプールに配置する必要があります。

于 2012-07-31T13:33:36.173 に答える