3

Fusion ローダーが警告や確認なしで DLL を単純にスキップする原因を知っている人はいますか?

コマンドライン アプリケーションから (C# で) これを実行しようとすると、

Assembly.LoadFrom("c:\\Deploy\\bin\\WebServices.dll")

私はこれを見る:

「要求されたタイプの 1 つ以上をロードできません。詳細については、LoaderExceptions プロパティを取得してください。」

その DLL には Platform.DLL への依存関係がありますが、その依存関係の読み込みが失敗するため、このコード行は例外をスローします。Fusion アセンブリの読み込みメッセージを確認すると、次のように表示されます。

=== プレバインド状態情報 ===
ログ: DisplayName = Platform、Version=9.0.0.0、Culture=neutral、PublicKeyToken=null (完全指定)

...

ログ: このバインドは LoadFrom ロード コンテキストで開始されます。
WRN: ネイティブ イメージは LoadFrom コンテキストではプローブされません。ネイティブ イメージは、Assembly.Load() のように、既定の読み込みコンテキストでのみプローブされます。
ログ: アプリケーション構成ファイルが見つかりません。
ログ: C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\config\\machine.config のマシン構成ファイルを使用しています。
ログ: 現時点ではポリシーが参照に適用されていません (プライベート、カスタム、部分、または場所に基づくアセンブリ バインド)。
ログ: 新しい URL ファイルのダウンロードを試みています:///C:/Project/bin/Debug/Platform.DLL。
ログ: 新しい URL ファイルのダウンロードを試みています:///C:/Project/bin/Debug/Platform/Platform.DLL。
ログ: 新しい URL ファイル:///C:/Project/bin/Debug/Platform.EXE のダウンロードを試みています。
ログ: 新しい URL ファイル:///C:/Project/bin/Debug/Platform/Platform.EXE のダウンロードを試みています。
ログ: 新しい URL ファイル:///c:/Deploy/bin/Platform.DLL のダウンロードを試みています。
ログ: 新しい URL ファイル:///c:/Deploy/bin/Platform/Platform.DLL のダウンロードを試みています。
ログ: 新しい URL ファイル:///c:/Deploy/bin/Platform.EXE のダウンロードを試みています。
ログ: 新しい URL ファイル:///c:/Deploy/bin/Platform/Platform.EXE のダウンロードを試みています。

問題は、DLLが に存在しc:\Deploy\bin\Platform.DLL、適切なバージョンがあり、署名された公開鍵がないことです。

私が考えた
こと: 1. たぶん、本当に Platform.DLL の依存関係が壊れていて、この動作を引き起こしているのでしょうか? (Reflector で依存関係ツリーを追跡しましたが、欠落している DLL は見つかりませんでした)
2. リリース/デバッグの不一致、または 64 ビットと 32 ビットの違いがあるのでしょうか? しかし、すべてが同じマシン上に構築されました
。このログに「成功」​​メッセージも「失敗」メッセージも表示されません。例外のために失敗したことはわかっています。

PS 技術詳細:
マシン環境は Windows 2008 64 ビットで、.NET 2.0、3.0、および 3.5 がインストールされています。
この同じアプリケーションは別のマシン (Vista 32 ビット) で問題なく動作し、同じディレクトリ構造と DLL を使用しますが、それらはそのマシンでビルドされています。

4

1 に答える 1

1

はい、必要なdllが見つかったら停止するはずなので、5番目の「ダウンロードを試みています...」で見つかったはずです...

しかし、コマンド ライン アプリはどこから実行されているのでしょうか。Debug フォルダーの場合は、いくつか試してみることができます。

  1. 依存する dll を同じフォルダーに置く
  2. 次の形式の .config ファイルを使用して、アセンブリと参照に署名します。

    <dependentAssembly>
        <assemblyIdentity name="WebServices.dll" publicKeyToken="<whatever this public key it>" />
        <codeBase version="1.0.0.0" href="..\WebServices.dll" />
    </dependentAssembly>
    
  3. それらに署名し、依存アセンブリを GAC に配置します。

私は道を外れているかもしれませんが、それは試してみるいくつかのことです.

于 2009-09-17T22:00:04.747 に答える