2012-05-08 50 views
2

私はASP.NET WebサイトでVisual Studio 2010で開発中です。ほとんどのサイトは管理コード(F#およびC#)で書かれていますが、その機能の一部にアンマネージDLL(QuickPDF)を使用します。サイトはローカルで正常に動作しますが、ホスティングプロバイダ(aspnethosting.co.uk)に展開すると、LoadLibrary呼び出しが失敗し、IntPtr.Zeroのハンドルが返されます。ASP.NET WebサイトでLoadLibraryを使用してアンマネージDLLをロード

ホスティングプロバイダのコンソールによれば、サイトは完全(内部)の信頼レベルで実行されています。

DLLはWebサイトのbinディレクトリにあり、ホスティングプロバイダは適切な権限を持っていることを通知します。

私は、\。を使用してDLLに特定のパスを一切使用せず、現在のアセンブリパスがAssembly.GetExecutingAssembly()を使用しているかどうか試しました。CodeBase(下のF#コードを参照)ローカルで実行しているとき

この問題を解決するために他に何かできることはありますか?

はここDLLへのパスをうまくいくF#コードです:F#コードは、そのパスを使用していますどこ

let assemblyDirectory = 
    let codeBase = Assembly.GetExecutingAssembly().CodeBase; 
    let uri = new UriBuilder(codeBase) 
    let path = Uri.UnescapeDataString(uri.Path) 
    Path.GetDirectoryName(path) 

はここだ(それは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 
     { 
+0

Marshal.GetLastWin32ErrorはLoadLibrary関数の呼び出し –

+0

アントニオ後に返すものだ見る - ヒントをありがとう。それは0を返します。それが私に不幸にも何を伝えているのか分かりません。 – Kit

答えて

1

dllをロードできるときにLoadLibraryが失敗します。

DLLが存在しないときに発生する可能性があり(見つからない)OR DLLが存在する(と見られる)が、このDLLのいくつかの依存性がロードできませんでした。 私はあなたにお勧めします: 1.両方のケースでPATH環境変数を比較します。 GetEnvironmentVariable関数を試してください。 2. QuickPDF.dllで使用されているコンポーネントを確認し、aspnethosting.co.ukで提示されているかどうか確認してください。

2

私はそれをクラックしました。 QuickPDFは、32ビット版と64ビット版のDLLを提供します。私は64ビットバージョンを使用する必要がありました。 [赤い顔。]答えを出した人に感謝します。

関連する問題