1

私はここで大規模なプロジェクトでdll地獄にいます。プロジェクトでビルドされたdllをオーバーライドできるように、アセンブリに入れようとしているdllパッチがあります。.dll を StartProject に追加して既存のものを置き換えていますが、次のエラーが発生し、なぜそうなのかわかりません。特定のバージョンを False に変更しようとしましたが、ランタイム バージョンはすべて、各 dll で同一に見えます。この dll と他の dll のプロパティの唯一の違いは、SpecificVersion というオプションを使用することですが、これはとにかく false に設定されています。

Failed processing: System.IO.FileLoadException: Could not load file or assembly
XXX.XXX.XXX, Version=X.X.X.X, Culture=neutral, PublicKeyTok
en=5353c9f66d4ed1ec' or one of its dependencies. The located assembly's manifest
 definition does not match the assembly reference. (Exception from HRESULT: 0x80
131040)
File name: 'XXX.XXX.XXX, Version=X.X.X.X, Culture=neutral, P
ublicKeyToken=xxxxxxxxxxxxxxx'
   at XXX.XXX.XXX.XXX.XXX.XX(.....)

バインディングの fuslogvw 失敗出力を見ていると、次のようになります。再編集失礼します。

=== Pre-bind state information ===
LOG: User = X
LOG: DisplayName = DataObjects, Version=0.4.1060.0, Culture=neutral, PublicKeyToken=5353c9f66d4ed1ec
 (Fully-specified)
LOG: Appbase = file://X/lib/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = Program.exe
Calling assembly : Storage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: DataObjects, Version=0.4.1060.0, Culture=neutral, PublicKeyToken=5353c9f66d4ed1ec
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///X/DataObjects.DLL.
LOG: Assembly download was successful. Attempting setup of file: X\DataObjects.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: DataObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5353c9f66d4ed1ec
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
4

1 に答える 1

11

SpecificVersion は、プロジェクトをビルドするときにのみ重要です。実行時に、CLR は完全一致を見つけることを要求します。つまり、プロジェクトが最初にビルドされたときに使用された参照アセンブリの [AssemblyVersion] は、実行時に検出された [AssemblyVersion] と正確に一致する必要があります。不一致は非常に危険であり、プログラムがテスト対象のコードから大幅に変更されたアセンブリ内のコードを実行しようとすると、真の DLL 地獄が発生します。

したがって、パッチを作成する場合は、AssemblyInfo.cs ソース コード ファイルで宣言されている [AssemblyVersion] 属性が元のものと一致していることを確認する必要があります。自動的にインクリメントしないようにしてください。使用[1.0.*]は非常に一般的であり、常にこのランタイム エラーが発生します。

アセンブリにも厳密な名前が付けられているため、PublicKeyToken 値も一致する必要があります。必ず同じ秘密鍵で署名してください。

app.exe.config ファイル内の要素を使用する<bindingRedirect>ことは、CLR にバージョンの不一致を強制的に受け入れる方法です。


編集後: はい、アセンブリ バージョンには明らかに大きな不一致があります。アプリは DataObjects バージョン 0.4.1060.0 でビルドされましたが、バージョン 1.0.0.0 が見つかりました

于 2013-11-06T15:06:24.013 に答える