【问题标题】:Loading an unmanaged DLL using LoadLibrary in an ASP.NET web site在 ASP.NET 网站中使用 LoadLibrary 加载非托管 DLL
【发布时间】:2012-05-08 20:51:25
【问题描述】:

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

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

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
        {

【问题讨论】:

  • 查看 LoadLibrary 调用后 Marshal.GetLastWin32Error 返回什么
  • 安东尼奥 - 感谢您的提示。它返回 0。不幸的是,不确定这告诉我什么。

标签: asp.net f# loadlibrary


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    可以加载 dll 时,LoadLibrary 失败。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-07
      • 2013-06-24
      • 1970-01-01
      • 2019-08-15
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      相关资源
      最近更新 更多