在ASP.NET网站中使用LoadLibrary加载非托管DLL
我正在一个ASP.NET网站上工作,在Visual Studio 2010中开发。该网站的大部分内容都是用托管代码(F#和C#)编写的,但它的一些功能使用了非托管DLL(QuickPDF)。该站点在本地运行时运行良好,但部署到主机提供商(aspnethosting.co.uk)时,LoadLibrary调用失败,返回IntPtr.Zero句柄在ASP.NET网站中使用LoadLibrary加载非托管DLL,asp.net,f#,loadlibrary,Asp.net,F#,Loadlibrary,我正在一个ASP.NET网站上工作,在Visual Studio 2010中开发。该网站的大部分内容都是用托管代码(F#和C#)编写的,但它的一些功能使用了非托管DLL(QuickPDF)。该站点在本地运行时运行良好,但部署到主机提供商(aspnethosting.co.uk)时,LoadLibrary调用失败,返回IntPtr.Zero句柄 public PDFLibrary(string dllFileName) { dll = new DLL(dllFile
public PDFLibrary(string dllFileName)
{
dll = new DLL(dllFileName);
if (dll.dllHandle != IntPtr.Zero)
{
instanceID = dll.QuickPDFCreateLibrary();
dll.RegisterForShutdown(instanceID);
}
else
{
dll = null;
}
}
...
public DLL(string dllFileName)
{
dllHandle = LoadLibrary(dllFileName);
if (dllHandle == IntPtr.Zero)
throw new InvalidOperationException("Could not load library " + dllFileName);
else
{
根据托管提供商的控制台,该站点以完全(内部)信任级别运行
DLL位于网站的bin目录中,托管提供程序告诉我它具有适当的权限
我尝试过不使用任何特定的DLL路径,而是使用.\,并使用assembly.GetExecutionGassembly().CodeBase(请参见下面的F代码)计算出当前的程序集路径,这在本地运行时效果很好
我还能做些什么来帮你确定这件事吗
下面是计算DLL路径的F#代码:
let assemblyDirectory =
let codeBase = Assembly.GetExecutingAssembly().CodeBase;
let uri = new UriBuilder(codeBase)
let path = Uri.UnescapeDataString(uri.Path)
Path.GetDirectoryName(path)
这里是F#代码使用该路径的地方(选中该路径后指向DLL)
这是试图加载QuickPDF dll的C#代码-这是它失败的地方-即dllHandle等于IntPtr.Zero
public PDFLibrary(string dllFileName)
{
dll = new DLL(dllFileName);
if (dll.dllHandle != IntPtr.Zero)
{
instanceID = dll.QuickPDFCreateLibrary();
dll.RegisterForShutdown(instanceID);
}
else
{
dll = null;
}
}
...
public DLL(string dllFileName)
{
dllHandle = LoadLibrary(dllFileName);
if (dllHandle == IntPtr.Zero)
throw new InvalidOperationException("Could not load library " + dllFileName);
else
{
当可以加载dll时,LoadLibrary失败 当DLL不存在(未找到)或DLL存在(已找到)但无法加载此DLL的某些依赖项时,可能会发生这种情况。 我建议你: 1.比较两种情况下的路径环境变量。尝试GetEnvironmentVariable函数。
2.找出QuickPDF.dll使用的组件,并验证它们是否显示在aspnethosting.co.uk上。QuickPDF提供32位和64位版本的DLL。我需要使用64位版本。[红脸。]感谢那些提供答案的人。查看Marshal.GetLastWin32Error在LoadLibrary调用Antonio后返回-感谢您的提示。它返回0。不幸的是,我不知道这告诉了我什么。