如何强制应用程序仅使用c#中指定路径的库
本文关键字:路径 应用程序 何强制 | 更新日期: 2023-09-27 17:58:20
我有一些用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。
为什么会发生这种情况?
祝福你,皮特。
程序集只加载一次。在执行期间交换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
查看您对evamcdonnal答案的评论,您需要的是在不加载程序集的情况下确定程序集的版本。您可以(我甚至认为您应该)使用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);
希望能有所帮助,伊万。