2011-10-22 12 views
5

Consideriamo che abbiamo un'app a 3 livelli e abbiamo tre progetti denominati P1, P2, P3.Le dipendenze di riferimento C# sono diverse da VB?

Dipendenza: P1 (dati) < < P2 (Business Logic) < < P3 (Presentazione)

P2 ha una classe base X che è stato ereditato in un altra classe Y in P2 . Quindi, aggiungiamo il riferimento P1 a P2. Tuttavia, P3 utilizza P2. Y e non utilizza P1. X direttamente.

Per fare ciò dobbiamo aggiungere il riferimento P2 a P3. Ma c'è una differenza tra VB e C#.

In VB, aggiungiamo il riferimento P2 solo a P3. P2 usa P1 ma non importa per P3. Noi non è necessario aggiungere il riferimento P1 a P3. È abbastanza!

Ma, in C#, dobbiamo aggiungere rif P1 e P2 sia per P3 anche se la P3 non usa P1.x. Se non si aggiunge il riferimento da A a C, viene visualizzato l'errore seguente:

Il tipo "P1.X" è definito in un assieme non referenziato. È necessario aggiungere un riferimento all'assembly 'P1, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'.

Perché dobbiamo aggiungere due progetti in C#?

Oppure, invece di questo, possiamo bloccare questo comportamento?

risposta

1

Un possibile motivo è che P2 espone pubblicamente membri i cui tipi sono definiti in P1. In tal caso, P1 deve essere referenziato anche in P3, anche se non lo si utilizza esplicitamente in P3.

Esempio:

// Assembly P1 
public class C1 
{ 
    ... 
} 

// Assembly P2 
public class C2 
{ 
    public string Foo { get; set; } 
    public C1 Bar { get; set; } 
} 

// Assembly P3 
void Main() 
{ 
    C2 c = ... 
    Console.WriteLine(c.Foo); 
} 

Nel codice precedente, P3 utilizza C2 (definito in P2), e C2 espone un membro di tipo C1 (definito in P1), così P3 deve fare riferimento P1 (anche se non usa C2.Bar) .


EDIT: in realtà mi sbagliavo: è necessario fare riferimento P1 solo se non fa riferimento C2.Bar ... Il comportamento è esattamente lo stesso in VB come in C#, ho solo cercato (se non si aggiunge il riferimento a P1 si ottiene this error). Se in precedenza non si disponeva di questo vincolo nei progetti VB, è solo perché P3 non utilizzava nulla che dipendesse da P1.

+0

Questo spiega la distinzione VB.NET/C#? –

+0

@Kirk, no non ... –

+1

Sì, come hai detto che dobbiamo aggiungere P1 ref a P3 in C#. Ma non dobbiamo aggiungerlo in VB. Questa è la domanda che ho posto ... –

Problemi correlati