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