我们有两个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,一切正常工作
任何有关这方面的见解?
听起来像是DLL的问题。很难说。您需要添加一些诊断程序,并找出哪个调用失败(是否是'LoadLibrary'),如果有的话,错误代码是什么。你需要在你的p/invokes上使用'SetLastError = true'。 – 2012-07-31 13:38:47
DLL正在使用可锁定资源(磁盘上的文件进行日志记录等)的机会?您确实需要一条错误消息才能诊断此问题。 – 2012-07-31 15:11:17