0

次のような状況で、アセンブリの解決がどのような順序で行われるかを誰かに教えてもらえますか?

私のビンには、exeファイルと2つのdllがあります。

  • アセンブリA(バージョン1)、BおよびCがXにマージされました(したがって、4つのアセンブリが1つになります)
  • アセンブリA(バージョン2)

私が行ったすべての参照には、UserSpecificVersionパラメーターが含まれていませんでした。

  • さて、私のexeの呼び出し中に、どのAが使用されていますか?
  • また、アセンブリBの呼び出し中に、どのAが使用されていますか?

そして、それが逆の場合はどうなりますか(つまり、最初にBから、次に私のexeファイルから)

これに関するドキュメントはありますか?

4

1 に答える 1

0

私が行ったすべての参照には、UserSpecificVersionパラメーターが含まれていませんでした。

参照アセンブリの「特定のバージョン」設定を実際に意味し、Falseに設定したと仮定します。これは実行時には効果がなく、コンパイル時にのみ効果があります。アセンブリを追加すると、参照アセンブリの[AssemblyVersion]が記録されました。その後、プログラムを再コンパイルしても、バージョンが異なる参照アセンブリが見つかった場合は、文句を言わずに新しいものをそのまま使用します。これは一般的に危険であり、元のリファレンスアセンブリを失い、新しいリファレンスアセンブリがどの程度変更されたかわからない場合にのみ、これを実行しようとします。この設定は常にデフォルトのTrueのままにしておき、抜け出せない深い穴を掘った場合にのみFalseを使用します。

実行時に、参照アセンブリから記録された正しい表示名と[AssemblyVersion]を持つアセンブリを見つけることを常に要求します。一般に、同じ名前と名前空間を持つ2つのアセンブリがある場合は問題が発生します。その穴から抜け出すには、外部エイリアスが必要になる傾向があります。ILMergeを使用すると、アセンブリの表示名が変更されるという回避策になる可能性があります。ただし、それでも名前空間とタイプの名前が競合することになりますが、その障害をどのように回避したかは明らかではありません。

したがって、一般的な結果は、EXEが名前が変更されたアセンブリ表示名を使用してA2を検索しようとし、BがA1を検索しようとすることです。提供された情報から100%忠実にそれを特定することはできません。非一般的なケースがある場合は、Fuslogvw.exeを使用してアセンブリバインディングのトレースを取得します。必ず「すべてのバインドをログに記録する」オプションを選択してください。

于 2012-12-07T15:40:59.447 に答える