2011-09-20 72 views
0

上週我和朋友討論瞭如何使用DLL(.net DLL)中的類。我有一個.net DLL,我需要在我的exe中使用它。在EXE中使用DLL

通常,

  1. 我添加DLL在我的解決方案,在我的Exe
  2. 基準的DLL創建的類的對象(它是在我的DLL)
  3. 開始調用方法/功能在剛剛創建的對象的類中。

但最後決定,我們應該使用Reflection而不是我們正在做的方式。原因是鬆散耦合。可以更改DLL中的功能並編譯它。在這種情況下,您不需要編譯客戶端代碼。

我對此背景有疑問。

假設,我有一個非常簡單的應用程序(說控制檯應用程序),我有兩個類都寫作做不同的工作。

class Program 
{ 
    static void Main() 
    { 

     //How do you create a object of the class A. 

    } 
} 


class A 
{ 

    string A = "I am from A"; 
    public B b; 
    public A 
    { 
     b = new B(); 

    } 
} 

class B 
{ 

    string B = "I am from B"; 
    public B 
    { 

    } 
    public void Print() 
    { 
     Console.WriteLine(B); 
    } 
}  

你如何創建一個類的對象時,所有三個類別相同的exe文件,以及如何創建同一個對象時,A類和不同的DLL B類。

第二部分問題的一個答案是使用界面和使用反射。

反射是否真的需要它,或者它是一種編程標準。

什麼是創建類的對象的最佳做法。

+6

接口是實現鬆耦合的正確方法。我不知道如何使用反射來實現鬆耦合,但使用反射任何好的模式/方法將不會涉及。 –

+1

一般說,你不需要重新編譯/部署在C#中的.exe *不*使用反射,除非你改變方法名稱/簽名/等實際上在.exe中使用,在這種情況下,你將不得不在任何情況下重新編譯。使用沒有反射的接口,你應該沒問題。 –

+1

是的,請不要嘗試使用反射來複制類庫的功能...... –

回答

1

接口提供了一種鬆散耦合的方法。

如果您希望提供在不重新編譯甚至重新部署的情況下擴展或替換功能的能力,那麼您基本上將在基於接口的鬆散耦合之上查看插件類型體系結構。

您可以使用反射來迭代並創建對象的實例,但另一個選項是配置/註冊。例如,在您的配置文件(或註冊表等)中,您可以指向實現該接口的文件和類,並使用System.Activator在運行時創建它。

實施例:

http://msdn.microsoft.com/en-us/library/ms972962.aspx

另一個更健壯的選擇是MEF。這是一個由.net框架團隊開發的插件框架。

退房此鏈接:

http://mef.codeplex.com/

從該鏈接(reenforcing你的問題):

「報名條件頻繁變化,軟件不斷髮展的結果,這樣的應用程序往往會成爲。單一性使得難以添加新的功能。託管擴展性框架(MEF)是一個新的庫。通過簡化可擴展應用程序和組件的設計來解決此問題的.NET Framework 4和Silverlight 4。 「

希望有所幫助。