我有两个版本的相同dll。比如说,Test.dll。我想从我的控制台应用程序中调用2个dll。
我尝试使用Extern别名。但它正在呼唤新的DLL。我从我的DAL课程中调用这两个dll。
任何帮助都将不胜感激。
谢谢,
答案 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)
您可以使用Assembly.LoadFile或使用别名