2012-05-08 57 views
2

我正在开发一个ASP.NET网站,在Visual Studio 2010中开发。大多数网站都是用托管代码(F#和C#)编写的,但它使用非托管DLL(QuickPDF)的一些功能。该网站在本地正常运行,但是在部署到托管提供商(aspnethosting.co.uk)时,LoadLibrary调用失败,返回一个IntPtr.Zero句柄。在ASP.NET网站中使用LoadLibrary加载非托管DLL

根据托管服务提供商的控制台,该站点运行在Full(内部)信任级别。

DLL位于网站的bin目录中,并且托管提供程序告诉我它具有适当的权限。我试过没有使用特定的路径在所有的DLL,使用。\,也工作出什么当前的程序集路径使用Assembly.GetExecutingAssembly()。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)

let dllPath = Path.Combine(assemblyDirectory, "QuickPDFDLL0814.dll") 
if not (File.Exists(dllPath)) then 
    failwith ("Could not find QuickPDF DLL at: " + dllPath) 
let lib = QuickPDFDLL0814.PDFLibrary(dllPath) 

这里的试图加载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 
     { 
+0

查看什么是Marshal.GetLastWin32Error在LoadLibrary调用后返回 –

+0

安东尼奥 - 谢谢你的提示。它返回0.不知道什么是不幸的告诉我。 – Kit

回答

1

当DLL可以加载时,LoadLibrary失败。

当DLL不存在(未找到)或DLL存在(并找到)时可能发生,但该DLL的某些依赖性无法加载。 我建议你: 1.比较两种情况下的PATH环境变量。尝试GetEnvironmentVariable函数。 2.找出QuickPDF.dll使用哪些组件,并验证它们是否在aspnethosting.co.uk上提供。

2

我破解了它。 QuickPDF提供了一个32位和64位版本的DLL。我需要使用64位版本。 [红脸]感谢那些提供答案的人。

相关问题