调用不同程序集的不同版本

本文关键字:版本 程序集 调用 | 更新日期: 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的不同版本