2

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
        {
4

2 に答える 2

2

私はそれを割った。QuickPDF は、DLL の 32 ビットおよび 64 ビット バージョンを提供します。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 に答える