首页 文章

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

提问于
浏览
2

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

根据托管服务提供商的控制台,该网站以完整(内部)的信任级别运行 .

DLL位于网站的bin目录中,托管服务提供商告诉我它具有适当的权限 .

我尝试使用 . \来完全不使用DLL的特定路径,并且还使用Assembly.GetExecutingAssembly()计算当前程序集路径的内容.CodeBase(参见下面的F#代码) - 在本地运行时工作正常 .

我能做些什么来帮助解决这个问题?

这是F#代码,它解决了DLL的路径:

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)

这是C#代码,其中尝试加载QuickPDF dll - 这是它失败的地方 - 即 . 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
        {

2 回答

  • 1

    加载DLL时LoadLibrary失败 .

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

  • 2

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

相关问题