2013-11-01 117 views
2

我在C#.NET 4.0的工作動態加載DLL引用其他DLL

我有架構的以下部分:

  1. 三 「一般」 的DLL:X.dll,Y.dll和Z.dll
  2. 一個 「特定」 DLL(A.DLL),其被引用 「一般」 的DLL
  3. 動態加載A.DLL (I使用System.Reflection.Assembly ass = Assembly.LoadFrom(filename)
一個C#應用程序

由於應用程序沒有明確引用這些「常規」DLL,我得到一個異常。

所以我的問題是是否有機會創建A.dll的方式,將允許加載此DLL而無需加載這些「常規」的DLL。似乎我不能記住它所引用的所有DLL,而無法轉移我的A.dll。

我相信在C#4.0中它是如何完成的,這裏有一個很好的邏輯,但是也許有一些例外?

感謝您的幫助!

+0

你想從A.DLL或訪問執行代碼它的資源? – Robert

+0

A是否被打包並以任何特定方式部署?如果是這樣,你可以包含「通用」DLL作爲該部署的一部分,並將它們全部添加到應用程序目錄,以便它們對主應用程序「可見」? –

回答

0

這裏的問題是你的應用程序只加載因此A.dll就是這樣被複制到輸出目錄中唯一的DLL,所以當A嘗試從X訪問代碼,它失敗,因爲應用程序不知道在哪裏X因此無法加載它。

這裏最簡單的解決方案是將其他「常規」DLL安裝到GAC中。或者,只需將「常規」DLL發佈到您的應用程序中,因爲它們不會被加載,除非您仍然使用A,儘管如果它們不是必需的,它們在安裝/應用程序大小上是不必要的膨脹。

+0

他從來沒有說過他在引用'A.dll',但是動態加載它,這意味着'A.dll'可能不在輸出目錄中。 – Eluvatar

+0

@Eluvatar通過引用我真正的意思是「加載」,換句話說,應用程序知道*從問題加載'A'的地方是它不知道從哪裏加載其餘部分。 – James

+0

如果X,Y,Z到達A加載的同一目錄,是否「足夠」? –

0

的問題是相同的上述

描述了「這裏的問題是你唯一的負載應用A.DLL因此這是一個的複製到輸出目錄,所以當從X它失敗,因爲一個嘗試訪問代碼的唯一DLL該應用程序不知道X因此無法加載它。「

但你可以把這三個「一般」的DLL:X.dll,Y.dll和Z.dll到一個文件夾說genDllFolder

String genDllFolder = "yourpath/genDllFolder"; 
    AppDomain.CurrentDomain.AppendPrivatePath(genDllFolder); 
    System.Reflection.Assembly ass = Assembly.LoadFrom(filename)); 
+0

我面臨同樣的問題。在這裏,我可以只叫'Assembly。LoadFrom(文件名);'一次又一次地引用其中的所有類,而沒有所有這些複雜的反射調用? – tigerden

+0

是的,編譯前也可以直接引用 –

+0

但是在那種情況下我需要使用反射嗎?如果一個類'Foo'存在於dll中,那麼我可以簡單地執行'Foo fObj = new Foo();'? – tigerden