Fusion Loaderが実際に存在するDLLを見つけることができません
-
10-07-2019 - |
質問
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フォルダーの場合は、次のことを試してください
- 同じフォルダーに依存するdllがある
-
次の形式の.configファイルを使用してアセンブリと参照に署名します
<dependentAssembly> <assemblyIdentity name="WebServices.dll" publicKeyToken="<whatever this public key it>" /> <codeBase version="1.0.0.0" href="..\WebServices.dll" /> </dependentAssembly>
-
それらに署名し、GACに依存アセンブリを配置します。
私は大丈夫かもしれませんが、試してみることはいくつかあります。