2010-02-18 21 views
16

Tengo una solución C# y está compuesta de numerosos proyectos.Pregunta de la referencia del proyecto C#

Tengo un proyecto que es mi base de ensambles que contiene toda la información común que usan otros proyectos. Todos los otros proyectos tienen referencias a conjuntos base.

Agregué una referencia dll en mis bases pero los demás proyectos no pueden verla.

¿Cómo puedo hacer para que los otros proyectos puedan ver la DLL a la que se refieren los conjuntos base? No quiero tener que agregar el DLL a todos los proyectos, ya que eso frustra el propósito de mi proyecto baseassemblies.

Respuesta

23

El enfoque correcto es que sus otros ensambles NO necesiten una referencia a esa otra DLL. La forma correcta de hacerlo es no hacer que sus ensamblajes básicos expongan ninguno de los tipos que están dentro de ese DLL. Envuelva toda la funcionalidad que necesita en los ensamblajes básicos, y asegúrese de que quienquiera que consuma sus ensambles base, NO necesite el conocimiento de los ensambles base del dll subyacente. De lo contrario, cada proyecto que haga referencia a sus ensamblajes base, si necesitan usar algo que está contenido en ese dll, tendrán que hacer referencia a él.

+2

+1 me ganaste.Estoy de acuerdo 100% –

+2

Esto no es práctico en muchos casos con grandes bases de código. Es una buena respuesta "teórica", pero requiere mucho esfuerzo adicional en la codificación y las pruebas para que esto suceda (a menudo) sin valor agregado. No estoy diciendo que sea * nunca * apropiado, por supuesto ... –

9

No hay referencias transitivas en .NET. Si un ensamblado necesita hacer referencia a otro, debe hacerlo directamente, no puede "heredar" esa referencia de otra referencia.

Tenga en cuenta que un proyecto solo necesita referencia de ensamblajes desde donde utiliza tipos directamente. Si A usa B y B usa C, pero A no usa directamente C, entonces A solo necesita hacer referencia a B directamente (el cargador manejará B haciendo referencia a C).

3

En resumen, no puede hacerlo. Debe agregar una referencia al archivo DLL que contiene el código que está tratando de usar, de lo contrario no podrá verlo.

Mi sugerencia sería crear una capa en su proyecto 'BaseAssemblies' a la que puede acceder desde su aplicación que esencialmente crea una arquitectura por niveles. Capa

ejemplo

Aplicación - Usos IDataClass
negocios Capa de lógica - Define IDataClass
Data Access Layer - MyRawDataClass (implementa IDataClass)

A partir del ejemplo, la capa de aplicación sólo necesita una referencia al BAL para poder interactuar con el DAL.

0

Puede hacer que sus BaseAssemblies exporten interfaces que deben ser implementadas por su "otra" dll. Además, sus BaseAssemblies necesitan alguna funcionalidad de "fábrica de clase" para esas clases.

0

Otros carteles son correctos: no se puede hacer. Esto es, en mi humilde opinión, patético por parte de Visual Studio. "make" se manejó así de limpio hace 20 años ...

0

Hay casos en los que su proyecto se refiere a A, que a su vez hace referencia a B pero cuando construye, B no siempre está en la carpeta BIN y solo se da cuenta esto cuando el código se está ejecutando. Hay una pregunta relacionada SO HERE. La gente lo ha resuelto de maneras extrañas, pero específicamente me gustó la solución de John Hunter. Esta SO thread también analiza una solución en la que utiliza eventos de compilación para lograr los resultados deseados.

Cuestiones relacionadas