2011-10-22 12 views
5

Considere que tenemos aplicaciones de 3 niveles y tenemos tres proyectos llamados P1, P2, P3.¿Las dependencias de referencia C# son diferentes a VB?

Dependencia: P1 (Datos) < < P2 (lógica de negocios) < < P3 (Presentación)

P2 tiene una clase base X que se hereda de otra clase Y en P2 . Entonces, agregamos el ref P1 a P2. Sin embargo, P3 usa P2. Y y no usa P1. X directamente.

Para hacer esto, tenemos que agregar ref P2 a P3. Pero hay una diferencia de entre VB y C#.

En VB, agregamos ref P2 solo a P3. P2 usa P1 pero no importa para P3. Nosotros no es necesario agregar ref P1 a P3. ¡Esto es suficiente!

Pero, en C#, hay que añadir ref P1 y P2 a P3 tanto incluso si el P3 no utiliza P1.X. Si no agrega ref A a C, obtendrá el siguiente error:

El tipo 'P1.X' se define en un conjunto al que no se hace referencia. Debe agregar una referencia al ensamblado 'P1, Versión = 1.0.0.0, Cultura = neutral, PublicKeyToken = null'.

¿Por qué debemos agregar dos proyectos en C#?

O, en lugar de esto, ¿podemos bloquear este comportamiento?

Respuesta

1

Una posible razón es que P2 expone públicamente a los miembros cuyos tipos están definidos en P1. En ese caso, también se debe hacer referencia a P1 en P3, incluso si no lo usa explícitamente en P3.

Ejemplo:

// 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); 
} 

En el código anterior, P3 utiliza C2 (definido en P2), y C2 expone un miembro de tipo C1 (definido en P1), por lo que P3 debe hacer referencia P1 (incluso si no usa C2.Bar) .


EDIT: en realidad estaba equivocado: debe hacer referencia P1 sólo si usted hace referencia C2.Bar ... El comportamiento es exactamente el mismo en VB como en C#, he intentado (si no agrega el referencia a P1 obtienes this error). Si anteriormente no tenía esta restricción en los proyectos de VB, es solo porque P3 no estaba usando nada que dependiera de P1.

+0

¿Esto explica la distinción VB.NET/C#? –

+0

@Kirk, no, no ... –

+1

Sí, como dijiste, tenemos que agregar P1 ref a P3 en C#. Pero no tenemos que agregarlo en VB. Esta es la pregunta que hice ... –

Cuestiones relacionadas