在ASP.NET网站中使用LoadLibrary加载非托管DLL

在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

我正在一个ASP.NET网站上工作,在Visual Studio 2010中开发。该网站的大部分内容都是用托管代码(F#和C#)编写的,但它的一些功能使用了非托管DLL(QuickPDF)。该站点在本地运行时运行良好,但部署到主机提供商(aspnethosting.co.uk)时,LoadLibrary调用失败,返回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位于网站的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。不幸的是,我不知道这告诉了我什么。