2013-09-22 34 views
6

對於這個狡猾的問題抱歉 - 如果有人有更好的建議,很樂意改寫。如何動態引用查找其他程序集的程序集?

我想通過動態調用屬於另一個應用程序的程序集來創建一個對象。

以下PowerShell代碼工作很好地對我說:

[Reflection.Assembly]::LoadFrom("C:\Program Files\Vendor\Product\ProductAPI.dll") 
$bobject = new-object ProductAPI.BasicObject  
$bobject.AddName("Some Name") 

我掙扎做在C#同樣的事情。基於在計算器上其他職位目前,我有這樣的:

System.Reflection.Assembly myDllAssembly = 
System.Reflection.Assembly.LoadFile("C:\\Program Files\\Vendor\\Product\\ProductAPI.dll"); 

System.Type BasicObjectType = myDllAssembly.GetType("ProductAPI.BasicObject"); 

var basicObjectInstance = Activator.CreateInstance(BasicObjectType); 

最後一行導致TargetInvocationException。

{「無法加載文件或程序集'AnotherObject,Version = 1.2.345.0,Culture = neutral,PublicKeyToken = null'或其依賴項之一,系統找不到指定的文件。

似乎BasicObject構造函數試圖調用另一個對象(來自AnotherObject.dll在同一個文件夾中)但找不到它。

有關如何解決此問題的任何提示?

+0

我認爲您正在加載的DLL需要另一個DLL才能工作。您可以使用此工具探索DLL的依賴關係。 http://www.dependencywalker.com/ – cgTag

+0

當您找到缺少的DLL。將其複製到發佈文件夾或修改Windows PATH以包含它。 – cgTag

+0

值得檢查什麼是無法加載['FUSLOGVW.exe'](http://msdn.microsoft.com/en-us/library/e74a18c4.aspx)(* Assembly Binding Log Viewer *),它會告訴你什麼是無法加載(以及.NET加載器所在的位置)。 – Richard

回答

7

如果在​​中找不到相關程序集,則需要手動指定如何找到它們。

兩個最簡單的方法,我知道這樣做的:

  1. Assembly.Load手動加載依賴程序提前。

  2. 處理正在加載 程序集的域的AssemblyResolve事件以及其他程序集依賴項。

這兩個本質上都需要你知道你試圖加載的程序集的依賴關係,但我不認爲這是一個很大的問題。

如果您選擇第一個選項,那麼查看滿載和reflection-only Load之間的區別也是值得的。如果你寧願用2(我推薦),你可以嘗試類似這樣的方法,它有嵌套的依賴鏈的額外好處(例如MyLib.dll引用LocalStorage.dll引用Raven.Client。 DLL參考NewtonSoft.Json.dll),並且還會爲您提供有關哪些依賴項無法找到的信息:

AppDomain.CurrentDomain.AssemblyResolve += (sender,args) => { 

    // Change this to wherever the additional dependencies are located  
    var dllPath = @"C:\Program Files\Vendor\Product\lib"; 

    var assemblyPath = Path.Combine(dllPath,args.Name.Split(',').First() + ".dll"); 

    if(!File.Exists(assemblyPath)) 
     throw new ReflectionTypeLoadException(new[] {args.GetType()}, 
      new[] {new FileNotFoundException(assemblyPath) }); 

    return Assembly.LoadFrom(assemblyPath); 
}; 
+1

太棒了!我認爲你最後的兩個引用'路徑'應該是'assemblyPath',對吧? – gf131072

+0

是的謝謝,現在修復。 – nathanchere

相關問題