调用不同程序集的不同版本
本文关键字:版本 程序集 调用 | 更新日期: 2023-09-27 18:14:06
我有两个版本的相同的dll。比如named, Test.dll。我想从我的控制台应用程序中调用2个dll。
我尝试使用外部别名。但是它正在调用新的dll。我从我的DAL类调用这两个dll。
如有任何帮助,不胜感激。
谢谢,
这不是你在。net中做事情的默认方式,因此以这种方式编码将不容易。正如@Johnathon Reinhart在他的回答中所说,您必须使用Assembly.Load
(通过将完全限定的程序集名称传递给函数)。这样的:
Assembly asmOld = Assembly.Load("MyAssembl, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ab1234567defabc1");
Assembly asmNew = Assembly.Load("MyAssembl, Version=2.0.0.1, Culture=neutral, PublicKeyToken=ab1234567defabc1")
此外,您必须保持对两个程序集的引用,然后使用Assembly.CreateInstance
创建所需类型的实例。之后,您将不得不使用反射来调用成员(类似于这样)。这样的:
Ojbect objOld = asmOld.CreateInstance("MyApp.Namespace.Classname");
Ojbect objNew = asmNew.CreateInstance("MyApp.Namespace.Classname");
objOld.GetType().InvokeMember("TestMethod", BindingFlags.InvokeMethod,null,obj,null);
objNew.GetType().InvokeMember("TestMethod", BindingFlags.InvokeMethod,null,obj,null);
为了改进代码编写,您可以使用Microsoft.VisualBasic.CompilerServices
中的LateCall
来处理您的对象。Andy Adinborough有一个很好的包装- http://andy.edinborough.org/Use-Late-Binding-in-C-Now-without-NET-4-0
我假设这些dll是。net程序集,而不仅仅是标准的C dll。
如果是这样,我认为你可以专门加载程序集与静态Assembly.LoadFrom(string assemblyFile)
。然后我认为你可以从Assembly.GetModule()
的组装中获得一个模块。
您可以使用程序集。LoadFile或使用别名
- 加载同一程序集的多个版本
- 在一个应用程序中使用同一个dll的不同版本