2

我正在开发一个在 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
        {
4

2 回答 2

2

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

于 2012-05-09T21:23:49.160 回答
1

可以加载 dll 时,LoadLibrary 失败。

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

于 2012-05-08T22:31:18.073 回答