两次加载相同的程序集但版本不同
Loading the same Assembly twice but with different version
我有一个程序集 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(...)
正确 returns myObject1
请求的实例
第二次调用 Activator.CreateInstance(...)
returns 再次 myObject1
而不是 myObject2
代码编译并且程序运行没有异常或可观察到的问题,除了我没有得到 myObject2
我知道 this answer 并且我认为我使用的代码是相同的,只是更新了一点(如果我错了请纠正我)。
在您的回答中,您对两个对象都使用了 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");
我有一个程序集 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(...)
正确 returnsmyObject1
请求的实例
第二次调用
Activator.CreateInstance(...)
returns 再次myObject1
而不是myObject2
代码编译并且程序运行没有异常或可观察到的问题,除了我没有得到
myObject2
我知道 this answer 并且我认为我使用的代码是相同的,只是更新了一点(如果我错了请纠正我)。
在您的回答中,您对两个对象都使用了 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");