1

.NET DLLがロードされ、別のアプリドメインから置き換えられ(DLLが新しいバージョンで更新され)、次に再ロードされた場合(を使用してAssembly.LoadFrom)、バージョン情報が古いバージョンを反映しているのはなぜですか?

assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), false)同じことがまたはで観察されassembly.GetCustomAttributes(typeof(AssemblyVersionAttribute), false)ます。

これは正常な動作ですか?ただし、エクスプローラーでファイルを調べると、正しいバージョンが表示されます。

DLLの実際のバージョンを取得する方法はありますか?

4

2 に答える 2

4

アセンブリを AppDomain に読み込むと、アンロードできません。そのため、ファイルを置き換えて、既にアセンブリを読み込んでいる AppDomain に再読み込みしても機能しません (これは仕様によるものです)。置き換えられたアセンブリを読み込むには、新しい AppDomain が必要です。

于 2012-08-22T15:40:55.257 に答える
3

あまり明確ではありませんが、「再読み込み」という用語は、表示される内容の強力な指標です。CLR は、Assembly.LoadFrom() を使用して同じアセンブリの別のバージョンを再読み込みすることを許可しません。これは強力な DLL Hell 対策であり、厄介な実行時例外の多くを回避します。特に、「Foo を Foo にキャストできません」という InvalidCastExceptions。.NET の型 ID には、アセンブリの [AssemblyVersion] が含まれます。Assembly.LoadFrom() を呼び出すと、以前に読み込まれたアセンブリへの参照が返されます。

また、AppDomain からアセンブリをアンロードする方法もありません。できることは、新しいAppDomain を作成することだけです。

Assembly.LoadFile() について言及する必要はありません。このチェックは実行されません。これは大きな問題です。

于 2012-08-22T15:48:15.420 に答える