2013-04-12 97 views
0

我不希望這樣:Assembly.LoadFrom(PathToAssembly)loading Net。將DLL文件動態添加到我的項目中

我需要真正把運行時代碼中的dll帶到我的項目中,然後在沒有激活器類的情況下使用它的類。完全像我加載一個網。 DLL文件進入我的項目不在運行時,但現在我需要在運行時添加。

+1

在解決方案中添加對其的引用。 –

+0

Assembly.LoadFrom有什麼問題?它動態加載 –

+0

是否會鉤住你的問題的答案? http://stackoverflow.com/questions/11101223/hook-c-sharp-method-in-dll –

回答

3

在這種情況下,您將遵循接口模式。在哪裏創建一個包含所有所需方法存根的接口類。你仍然會執行你的Assembly.Load,但是你將結果激活的對象投射到你的接口類。

我沒有在c#中的例子,但這個vb.net應該很容易遵循。

Dim alib As Byte() = System.IO.File.ReadAllBytes(Application.StartupPath & "\\PeriodicMinimumsUtilities.dll") 
Dim adeb As Byte() = System.IO.File.ReadAllBytes(Application.StartupPath & "\\PeriodicMinimumsUtilities.pdb") 
Dim assembly As System.Reflection.Assembly = System.Reflection.Assembly.Load(alib, adeb) 
Dim type As Type = Assembly.GetType("PeriodicMinimumsUtilities.frmPeriodicMinimumsReconcilliation") 
Dim obj As Fireblade.POS.Business.IPeriodicMinimumsUtilities = Activator.CreateInstance(type) 

接口:

Public Interface IPeriodicMinimumsUtilities 

    WriteOnly Property Database() As Meritsoft.GolfRez.Data.Database 
    Function LoadMinimumsDataSource(ByVal v_fiscalYear As String, ByVal v_fiscalPeriod As Integer) As DataSet 
    Function GetMinimumsSpent(ByVal v_fiscalYear As String, ByVal v_fiscalPeriod As Integer) As DataTable 
    Function LoadFiscalPeriodsDataSource(ByVal ImposeLimit As Boolean) As DataSet 

End Interface 
+1

也被稱爲**依賴注入**:http://stackoverflow.com/questions/130794/what-is-dependency-injection –

+0

謝謝DP,學會了一個新術語。 – DragonZero

+0

這不是依賴注入,這不是傳入對象一個類依賴於通過它的構造函數或屬性。這只是使用實現恰好在動態加載的DLL中的接口。 –

1
  1. 你需要引用的DLL就像你通常做的是能夠只是「利用」它
  2. 然後,使用LoadFrom或者,例如,你可以嵌入組件的資源,並從流
  3. 加載
+0

在項目中引用DLL不符合在運行時加載它的條件。 –

+1

Aaaand?這就是爲什麼你需要項目2. – Lanorkin

0

在運行時,沒有其他方式在.Net中動態加載程序集,而不是由Assembly提供的方法。也許你有一個更具體的問題與你提到的方法調用有關。如果是這樣,請通過更新您的問題來指定它,以便社區可以爲您提供幫助。

0

不能使用類型信息(使用類正常),並在運行時加載DLL,因爲你將沒有類型信息編譯。

你可以正常使用接口,並加載dll的接口,或者你可以引用dll並正常使用這些類。

第三個選項(但是一個可怕的想法)將反映你嘗試使用的所有類,使用幫助器方法和字符串來識別屬性和方法。不是使用類的正常方式,但它會在沒有類型信息的情況下進行實際編譯。

相關問題