2013-02-12 43 views
1

我對c#編程頗爲陌生。 所以讓我們假設我們有兩個組件ASM1,ASM2其中兩個類的定義如下:爲什麼沒有直接依賴於其他程序集的程序集必須引用它?

//Asm1 
namespace ClassLibrary1 
{ 
public class A//: B 
    { 
    B b = new B { i = 2}; 
    public int MyProperty { get { return b.i; } } 
    } 
} 

//Asm2 
namespace ClassLibrary2 
{ 
    public class B 
    { 
    public int i; 
    } 
} 

ASM1引用ASM2 現在我們有一個可運行的組件說,ASM3,使用ASM1與下面的代碼:

//Asm3 
A a = new A(); 
System.Console.Write(a.MyProperty.ToString()); 

上述代碼編譯正確無誤。

但是,當我們對A類進行小改動並且從B類繼承時,事情就出錯了。不會編譯併產生錯誤。 但是,當我們添加asm2作爲參考asm3它的作品。請告訴我爲什麼。 爲什麼一個程序集與另一個程序集沒有直接的依賴關係,必須引用它? 在此先感謝。

+0

可能的重複[爲什麼我(有時)必須引用程序集引用的程序集引用?](http://stackoverflow.com/questions/10210729/why-do-i-sometimes-have-to- reference-assemblies-referenced-by-the-assembly-ir) – ChrisF 2013-02-12 20:41:52

回答

2

在這種情況下,編譯器需要訪問您使用的類型的基類(即A)的程序集的聲明。確切的規則有些複雜。

據報道,使用.NET 4.0和Visual Studio 2010,如果您在一個程序集中繼承了第二個程序集中的類,該類從未引用的第三個程序集中公開類型(並且您自己的項目未公開任何這些類型) ,它會正常工作。但是,升級到.NET 4.5和Visual Studio 2012時,相同的代碼和參考組合失敗,並且必須引用第三個程序集。

+0

謝謝傑普。知道這很有趣。 – Jami 2013-02-13 15:50:50

0

那麼,如果你做了從Asm3到Asm1的項目參考,那麼就沒有必要將Asm2引用到你的項目中。在編譯過程中,它會抓取asm2並將其放入bin文件夾中。但是,如果您在Asm3中直接使用Asm1的二進制引用,則需要在bin中使用asm2(因爲asm1需要它)。這不一定需要引用asm2,但它必須在asm3的bin中。因此,你不需要手動拷貝Asm2到bin,因此你可以引用它,它會爲你複製它。但是,我會做以下事情,

我會把Asm1和Asm2放在一個文件夾中說依賴關係(對於asm3),那麼我只會在asm3中引用Asm1,在構建期間,asm2會被複制到bin目錄並且你會很好

所以總之,你的asm1需要asm2無論它走了。這就是爲什麼你需要它

+0

感謝你的代表Dan,但我正在談論Asm3和Asm2的關係。正如你在上面的代碼中看到的,當類A不是子類B時,不需要將它作爲asm3中的引用,並且在沒有它的情況下它會順利進行。那爲什麼呢? – Jami 2013-02-12 21:30:51

+0

當你確實有繼承,但是Asm1需要asm2時,是的,所以如果asm3要使用asm1,爲了asm1的正確功能,它需要asm2。我還編輯了一些答案,以澄清 – 2013-02-12 21:44:31

+0

我看着asm3清單,沒有像我期望的asm2引用。但你是對的。我明白了。我的asm1需要asm2無論它去哪裏 – Jami 2013-02-12 22:18:55

相關問題