0

私はC#で書かれたいくつかの簡単なコンソールアプリケーションを持っています(VS2008を使用)。

このアプリケーションでは、いくつかのライブラリの現在のバージョンを確認したいと思います。ライブラリへのパスはありますが、ライブラリを他のライブラリに置き換えると(最初のライブラリを別のディレクトリに移動します)、アプリケーションは、指定されたパスのライブラリを「見る」のではなく、最初のライブラリを「見る」ことになります。

コードは次のようになります。

private void Sth()
{
   Assembly assembly = Assembly.LoadFrom(libPath);
   Version ver = assembly.GetName().Version;
}

そして、私はこのメソッドを定期的に呼び出します(したがって、アセンブリはファイルを適切にロードする必要があります)。

そのため、アプリを起動し、指定されたパスのライブラリのバージョンが1.0.0.0の場合、アプリはそれを正しく表示します。しかし、ライブラリファイルを新しいもの(バージョン2.0.0.0)に置き換えても、アプリケーションは1.0.0.0を表示します。しかし、アプリケーションを閉じて再度実行すると、2.0.0.0が正しく表示されます。

なぜそれが起こっているのですか?

ピート、よろしくお願いします。

4

2 に答える 2

3

アセンブリは 1 回だけ読み込まれます。実行中にdllを交換しても、ロードされるバージョンは変更されません。そのアセンブリのコード行が実行されるたびに、アプリケーションがそのパスに移動するわけではありません。全体がメモリにロードされると、パス (およびそこにあるもの) はもはや関連性がなくなります。アプリを閉じて再度起動すると、フォルダーに移動し、そこにあるアセンブリが読み込まれるため、v2 が取得されます。

私が理解していることから、実行中にアセンブリを変更する方法はありません。この.NET アプリケーション ドメインのアセンブリを再ロードする方法は? 質問はそれについて議論し、一番上の答えはアセンブリをアンロードできないと言います。

編集:

 var assemblyInfo = AssemblyName.GetAssemblyName(pathToMyAssembly); //get assembly
 Version assemblyVersion = assemblyInfo.Version; // get version
 Version minVersion = new Version(1, 1, 4); // minimum version of 1.1.4
 if (minVersion.CompareTo(assemblyVersion) < 0)
       // the version is less than the minimum.
       // do something to reconcile problem
于 2013-02-09T00:32:12.533 に答える
2

evanmcdonnal's answer へのコメントを見て、必要なのは、アセンブリをロードせずにバージョンを判断することです。AssemblyName.GetAssemblyName Methodを使用して、必要なことを正確に行うことができます (アセンブリをロードするのではなく、アセンブリの Name を取得します)。

私はすぐにアプローチをテストし、dll ファイルを置き換えた後、正しい出力を表示することに成功しました。

var initialName = AssemblyName.GetAssemblyName("Foo.dll");
Console.WriteLine(initialName);
Console.WriteLine(initialName.Version);
// replaced the dll manually

initialName = AssemblyName.GetAssemblyName("Foo.dll");
Console.WriteLine(initialName);
Console.WriteLine(initialName.Version);

お役に立てば幸いです、イヴァン。

于 2013-02-09T23:59:27.060 に答える