【发布时间】: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