我有2個版本的相同dll。稱爲named,Test.dll。我想從我的控制檯應用程序調用2個dll。打電話給不同版本的不同程序集
我試着使用Extern別名。但它正在調用新的DLL。我從我的DAL課程中調用這2個dll。
任何幫助,將不勝感激。
感謝,
我有2個版本的相同dll。稱爲named,Test.dll。我想從我的控制檯應用程序調用2個dll。打電話給不同版本的不同程序集
我試着使用Extern別名。但它正在調用新的DLL。我從我的DAL課程中調用這2個dll。
任何幫助,將不勝感激。
感謝,
我假設這些DLL是.NET程序集,而不僅僅是標準C的DLL。
如果是這樣,我認爲你可以用靜態的Assembly.LoadFrom(string assemblyFile)
來加載程序集。那麼我認爲你可以從Assembly.GetModule()
獲得該組件的模塊。
這不是你在.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);
要提高代碼的編寫,你可以使用LateCall
從Microsoft.VisualBasic.CompilerServices
與你的對象工作。有一個很好的包裝對於安迪Adinborough - http://andy.edinborough.org/Use-Late-Binding-in-C-Now-without-NET-4-0
可以使用Assembly.LoadFile或使用別名
感謝的快速反應。然而我的方法需要DTO對象(自定義對象),需要找出執行它的方式 –