別のDLL(DllChild)への参照を持つバイナリ(DllParentと呼びましょう)があります。SpecificVersion
参照を追加するときに、プロパティをtrueまたはfalseに設定するオプションがあります。
Reflector(または同様のツール)でDllParentを見るとき、開発者がDllChildのSpecificVersionプロパティをtrueまたはfalseに設定したかどうかを確認する方法はありますか?
別のDLL(DllChild)への参照を持つバイナリ(DllParentと呼びましょう)があります。SpecificVersion
参照を追加するときに、プロパティをtrueまたはfalseに設定するオプションがあります。
Reflector(または同様のツール)でDllParentを見るとき、開発者がDllChildのSpecificVersionプロパティをtrueまたはfalseに設定したかどうかを確認する方法はありますか?
答えはいいえだ。
厳密に名前が付けられたアセンブリへの参照をプロジェクトに追加すると、VisualStudioはバージョンを含む完全な厳密な名前を.csprojファイルに保存します。
次に、各ビルド中にMSBuildコードがアセンブリ参照を解決しようとするとき、つまり、ビルド中に使用できる実際のアセンブリファイルを見つけるときに、SpecificVersion
が設定されている場合true
、.dllのバージョンはプロジェクトで指定されたバージョンと一致する必要がありますファイル。
これにより、アセンブリの新しいバージョンにアップグレードする場合、そのアセンブリを使用するすべてのプロジェクトで参照を変更する必要があるという問題が発生する可能性があります。そうしないと、ビルドが失敗するため、設定するだけで作業が簡単になります。SpecificVersion
にfalse
。
この場合、一部のメソッドシグネチャが変更されていると、アップグレード後もビルドが失敗する可能性があります。これは悪いことですが、プロジェクトのコンパイル中にエラーが発生した場合は修正可能ですが、実行時に同じことが許可される場合、エンドユーザーにとってこれは深刻な問題を引き起こします。
SpecificVersion
したがって、.Netでは、プロジェクトファイル内のの値に関係なく、ビルド時に使用された正確なバージョンの厳密な一致を強制することによってこれを行うことはできません。
MSBuildは、アセンブリ参照を含むバージョンをバイナリ.dllファイルに保存します。その後、Reflectorで調べると、プロジェクトの参照をどのように解決したかではなく、MSBuildが実際に使用した参照アセンブリのバージョンのみが表示されます。
参照されるアセンブリの開発者は、古いバージョンの代わりに新しいバージョンを安全に使用できることを指定できますが、これはさまざまなメカニズムで行われます。
パブリックインターフェイスが変更されたが、古いバージョンと互換性がある場合(たとえば、メソッドの追加は互換性がありますが、パラメーターの削除または変更は互換性がありません)、ポリシーファイルを新しいバージョンと一緒に展開して.Netシステムに次のことを通知できます。安全な代替品です。(http://msdn.microsoft.com/en-us/library/dz32563a.aspx)
パブリックインターフェイスがまったく同じで、メソッドの内部実装のみが変更された場合、参照されるアセンブリの開発者は同じAssemlyVersion
値を維持できますが、変更できAssemblyFileVersion
ます。この場合、Windowsエクスプローラーに表示されるファイルのバージョンは更新されますが、厳密な名前は同じままです。これは、MicrosoftがSystem.dllなどを更新するときに行うことです。
どちらの場合も、参照アセンブリ(質問ではDllParent)には元のバージョン番号が含まれています。