2010-04-06 110 views
2

我創建了一個程序集,其中包含從另一個程序集中定義的父級派生的子類。添加程序集引用還需要引用基本程序集

當我添加引用了孩子,Visula工作室還需要參考添加到父。

爲什麼會這樣,我怎麼能阻止它而不會丟失任何功能?

回答

0

在C/C++中,類定義存在於.h頭文件中。這使您能夠引用有關某個類的信息(例如,當您想從該類繼承時需要),而無需使用實現信息來源文件。缺點是代碼重複(在.cpp文件中的實現需要重複.h文件中的大部分信息)。

在.NET世界的設計是不同的:一個組件同時包含類(CLR字節碼)需要的代碼,以及所有的元數據(類名,它的成員等的信息),例如從該類繼承。

該設計的結果是,在爲了使用在從組件B中的類繼承組件A中定義的類,.NET需要A和B兩者的組件。或者更一般地說:如果您直接或間接使用給定程序集(類,枚舉,結構)中的任何東西,則需要引用該程序集。

我不確定你想要防止什麼。如果您決定像您所描述的那樣將代碼拆分爲兩個程序集,則無法引用這兩個程序集。

當然,構建代碼的方式不同,但不知道通過將代碼拆分爲2個程序集來實現您想實現的目標,因此無法提供有用的建議。

+0

目標是創建一個封裝,它將屏蔽最終用戶對底層的更改。這個包裝將引用基礎。因此,如果用戶必須參考基地,那麼他沒有完全屏蔽。 我理解組件怎麼淨是建立,但我不知道是否有繞過這個方式(一個瘋狂的想法是在運行時換基類直通反思,不知道這是可能的)。 – Mrchief 2010-07-15 00:18:43

1

你所描述的是部分可能的。你可以不需要顯式引用隱藏的程序集,但該程序集仍然會在編譯時被拉入,並且在運行時需要。

比方說你有這些類中定義:

// in assembly 1: 
public class A 
{ 
    public virtual void Foo() { } 
} 

// and in assembly 2: 

// requires explicit reference to assembly 1 to use 
public class B : A 
{ 
    public override void Foo() { } 
    public A Value { get; set; } 
    public void Foo(A value) { } 
} 
// has implicit reference to assembly 1, but end user can ignore 
public class C 
{ 
    private A Value { get; set; } 
    internal void Foo(A value) { } 
    protected internal A Bar() { return new A(); } 
} 
// usable at runtime even if assembly 1 is missing, as long as you don't call Foo() 
public class D 
{ 
    public void Foo() { A blah = new A(); } 
    public void Bar() { } 
} 

如果最終用戶使用的B類,他們將需要一個明確的參照裝配1.由於A是B的公共接口的一部分,爲了使用B,你必須知道A.有三種不同的公開引用A,並且他們中的任何一個都需要知道A使用B.

然而,C類引用了A,但所有引用都是私有/內部/本地。由於每個對A的引用都是從外部隱藏的,所以最終用戶不必明確知道程序集1.它在運行時仍然是必需的,但不必將它作爲引用添加,它是間接引用。

而且如果最終用戶使用d類,而沒有使用B或C,組件1將只得到,如果你叫D.Foo(),它具有A型。實際上,你可以使用D的局部變量加載Bar()即使組件1在運行時完全缺失也是如此。雖然如果你調用D.Foo()並且程序集1丟失,你會得到一個異常。

+0

我明白了。就我而言,我無法擺脫它,因爲我直接繼承(場景1)。然而,當時我正在尋找的答案是ILMerge(當然我當時沒有,但後來發現)! – Mrchief 2012-12-07 20:33:53

+0

它是如何工作的很好的解釋,但我想了解他們爲什麼這樣設計它。在進行構建時,無論如何Assembly1.dll都會轉到bin文件夾,爲什麼需要顯式引用? – Borek 2013-02-20 14:16:54

+0

這可能會讓編譯器的工作更輕鬆。通過這種方式,基本上可以說「這種類型需要明確引用另一個程序集」或「這種類型只包含對另一個程序集的內部引用」,而不必分析每個類的每個成員是如何使用的。 – 2013-02-20 14:46:05

相關問題