2

派生クラスを作成するためのWindowsコントロールとベースタイプを含む、署名されていないサードパーティのアセンブリライブラリのペアを使用しています。dllは、アプリケーションがインストールされるサブフォルダーにあります。私の制御を超えて、同じ名前の新しいバージョンのライブラリが、新しいバージョンの.Netランタイムに対して構築され、実行可能ファイルと同じディレクトリにインストールされます。

これにより、アプリケーションは次のようにBadImageFormatExceptionをスローします。

ファイルまたはアセンブリを読み込めませんでした'sharedlibA'[...]このアセンブリは、現在読み込まれているランタイムよりも新しいランタイムによってビルドされているため、読み込むことができません。

これが私が扱っているファイルシステム構造です:

[MyappFolder]
   |--Myapp.exe
   |--sharedlibA.dll (wrong version)
   |--sharedlibB.dll (wrong version)
   |--bin
       |--sharedlibA.dll (need to use this)
       |--sharedlibB.dll (need to use this)

さまざまなアセンブリ読み込みコンテキストと個別のAppDomainの作成について読んでいますが、これらはどれも機能していないようです。

編集

Hansが以下に提案するように、構成ファイルからプローブ情報を削除し、AssemblyResolveイベントをサブスクライブしたため、sharedlibAとsharedlibBを除いて、他のすべての依存アセンブリがそのイベントをトリガーします。それでもBadImageFormatExceptionが発生します。変更にもかかわらず、AppBaseフォルダーはまだプローブされているようです。

フュージョンログは次のとおりです。

=== Pre-bind state information ===
LOG: User = ...
LOG: DisplayName = sharedlibA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=643d95c7ce242296
 (Fully-specified)
LOG: Appbase = file:///C:/[MyappFolder]
LOG: Initial PrivatePath = NULL
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\[MyappFolder]\Myapp.exe.Config
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Post-policy reference: sharedlibA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=643d95c7ce242296
LOG: Attempting download of new URL file:///C:/[MyappFolder]/sharedlibA.DLL.
ERR: Failed to complete setup of assembly (hr = 0x8013101b). Probing terminated.

編集#2

私は自分の特定の問題を解決しました。以下に答えてください。

4

2 に答える 2

1

<codeBase>アプリケーション構成ファイルに要素を追加して各dllの正確な場所を指定することで、この問題を解決しました。<codebase>アセンブリをロードする必要があるたびにプロービングヒューリスティックが開始する前にチェックされるため、これは明らかに機能します。

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="sharedlibA" culture="neutral" publicKeyToken="..." />
      <codeBase version="1.0.0.0" href="bin\sharedlibA.dll" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="sharedlibB" culture="neutral" publicKeyToken="..." />
      <codeBase version="1.0.0.0" href="bin\sharedlibB.dll" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>
于 2012-10-09T20:20:12.243 に答える
0

これは本当に「やめなさい!」で対処されるべきです。これに対する非常に具体的な回避策は<probing>、.exe.configファイル内の要素を削除して、CLRがDLLを検出できなくなるようにすることです。そして、AppDomain.CurrentDomain.AssemblyResolveイベントを実装して、祝福されたものを返します。

于 2012-10-09T17:49:09.143 に答える