質問

Fusionローダーが警告や確認なしでDLLをスキップする原因は何ですか?

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

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

これが表示されます:

  

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

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

=== Pre-bind state information ===
LOG: DisplayName = Platform, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null (Fully-specified)

...

LOG: This bind starts in LoadFrom load context.
WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load().
LOG: No application configuration file found.
LOG: Using machine configuration file from C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\config\\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform.DLL.
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform/Platform.DLL.
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform.EXE.
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform/Platform.EXE.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform.DLL.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform/Platform.DLL.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform.EXE.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform/Platform.EXE.

問題は、DLLが c:\ Deploy \ bin \ Platform.DLL に存在し、適切なバージョンで署名済みの公開キーがないことです。

考えたこと:
1.おそらく破損しているPlatform.DLLの依存関係が原因で、この動作が発生していますか? (Reflectorで依存関係ツリーを追跡しましたが、欠落しているDLLは見つかりませんでした)
2.リリース/デバッグの不一致、または64ビットと32ビットのどちらかがありますか?しかし、すべてが同じマシンで構築されました
3.ログを誤読している可能性がありますが、見つかったDLLにヒットしたときに停止すべきではありませんか? 「成功」も表示されません。または「失敗」このログのメッセージ。例外のために失敗したことは知っています。

PSその他の技術詳細:
マシン環境はWindows 2008 64ビットで、.NET 2.0、3.0、および3.5インストール済み。
この同じアプリケーションは、別のマシン(Vista 32ビット)で同じディレクトリ構造とDLLで正常に実行されますが、それらはそのマシンで構築されました

役に立ちましたか?

解決

はい、必要な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に依存アセンブリを配置します。

私は大丈夫かもしれませんが、試してみることはいくつかあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top