Visual Studio 2010 で開発している ASP.NET Web サイトに取り組んでいます。ほとんどのサイトはマネージド コード (F# および C#) で記述されていますが、一部の機能にはアンマネージド DLL (QuickPDF) を使用しています。サイトはローカルで正常に動作しますが、ホスティング プロバイダー (aspnethosting.co.uk) に展開すると、LoadLibrary 呼び出しが失敗し、IntPtr.Zero のハンドルが返されます。
ホスティング プロバイダーのコンソールによると、サイトは完全 (内部) の信頼レベルで実行されています。
DLL は Web サイトの 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
{