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

时间:2011-11-10 04:52:36

标签: c# .net

我有两个版本的相同dll。比如说,Test.dll。我想从我的控制台应用程序中调用2个dll。

我尝试使用Extern别名。但它正在呼唤新的DLL。我从我的DAL课程中调用这两个dll。

任何帮助都将不胜感激。

谢谢,

3 个答案:

答案 0 :(得分:1)

这不是你在.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创建所需类型的实例。之后,您将不得不使用反射(something like this)呼叫成员。像这样:

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

答案 1 :(得分:0)

我假设这些DLL是.NET程序集,而不仅仅是标准的C DLL。

如果是这样,我认为您可以使用静态Assembly.LoadFrom(string assemblyFile)专门加载程序集。然后我认为你可以使用Assembly.GetModule()从该程序集中获取一个模块。

答案 2 :(得分:0)