加载相同的装配两次,但版本不同

时间:2016-01-27 08:32:57

标签: c# .net runtime version .net-assembly

我有一个名为asm.dll的程序集。

此程序集的版本为1.0.0.0(在AssemblyInfo.cs中设置

然后我需要在该程序集中进行一些代码修改(仍然是asm.dll),将版本提升到2.0.0.0并再次构建它。

现在,我有两个名为asm.dll的文件,这些文件在某些​​代码修改和版本号方面有所不同。

如何在运行时加载这两个文件?

附录:

现在我正在尝试以下方法:

var asm1 = Assembly.LoadFrom("dir1\asm.dll");
var asm2 = Assembly.LoadFrom("dir2\asm.dll");

var types1 = asm1.GetTypes();
var types2 = asm2.GetTypes();

Type type1 = types1.First<Type>(t => t.Name.Equals("myClassIWantToInstantiate"));
Type type2 = types2.First<Type>(t => t.Name.Equals("myClassIWantToInstantiate"));

MyObject myObject1 = (MyObject1)Activator.CreateInstance(type, new object[] { });
MyObject myObject2 = (MyObject2)Activator.CreateInstance(type, new object[] { });

但我得到以下行为:

  • Activator.CreateInstance(...)的第一次调用正确返回myObject1所需的实例

  • 第二次调用Activator.CreateInstance(...)会再次返回myObject1而不是myObject2

  • 代码编译,程序运行无异常或可观察到的问题,但我没有得到myObject2

我知道this answer并且我认为我使用的代码是相同的,只是更新一点(纠正我,如果我错了)。

1 个答案:

答案 0 :(得分:2)

在您的回答中,您正在为两个对象使用Activator.CreateInstance - 这是使用全局注册的任何内容。我相信从特定程序集加载的类型不足以做到这一点。

在您链接的答案中,使用Assembly.LoadFile而不是LoadFrom加载程序集,并在程序集实例上调用CreateInstance,而不是使用静态Activator.CreateInstance 。你试过这个吗?

var asm1 = Assembly.LoadFile("dir1\asm.dll");
var asm2 = Assembly.LoadFile("dir2\asm.dll");

MyObject myObject1 = (MyObject)asm1.CreateInstance("myClassIWantToInstantiate");
MyObject myObject2 = (MyObject)asm2.CreateInstance("myClassIWantToInstantiate");