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

程序集只加载一次。在执行期间交换 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 答案的评论,您需要在不加载程序集的情况下确定程序集的版本。您可以(我什至认为您应该)使用AssemblyName.GetAssemblyName 方法,该方法完全符合您的需要:检索程序集的名称,而不是加载它。

我已经快速测试了该方法,并且在我替换了 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 回答