13

Situación:Asamblea añadió a través de Agregar referencia no se copia en el directorio de salida a menos que se refiere el código de

  • Proyecto 1 es una asamblea en la solución
  • Proyecto 2 es un proyecto conjunto del ejecutable en la misma solución
  • proyecto 2 tiene una referencia de proyecto (a través de Agregar referencia) para el proyecto 1
  • proyecto 2 no lo hace directamente se refieren a espacios de nombres/tipos de proyecto 1 en el código
  • Proyecto 2 utiliza Ninject para cargar dinámicamente Proyecto 1 y el uso de las clases de implementación dentro de ella

Problema:

  • A pesar de que copia local se establece en True para la referencia, y no existe el ensamblaje de referencia en la GAC, el ensamblaje de referencia es no copiado en el directorio de construcción de salida
  • Ninject posteriormente no encuentra el montaje, y así no pasa la unión/resolución

Este proceso funciona bien para una configuración idéntica donde algunas clases del ensamblaje al que se hace referencia son referenciadas directamente, así como cargadas por Ninject, así que creo que la causa es la siguiente: Si VS detecta que no se hace referencia a ningún tipo dentro de un ensamblaje referenciado a en el código, no copiará el ensamblado al que se hace referencia, incluso si se agrega como referencia con Copy Local = True.

Solución (s):

  • Encontrar una manera de decir a VS, "copia local (lo digo en serio)" = True - esto sería mi solución ideal.
  • Agregue una referencia de archivo al ensamblado al que se hace referencia. No es genial, ya que pierdo las ventajas de una referencia de proyecto (que puede o no estar del todo en mi cabeza).
  • Consulte el ensamblaje de alguna manera 'token' en el código. Desordenado: me gustaría utilizar la lista de Referencias para mantener una lista de conjuntos/módulos que deseo incluir.
  • Pasos posteriores a la compilación para copiar el ensamblaje. Desordenado, no ideal.

¿Alguien puede ayudar con la primera solución o sugerir otra?

+1

'Si VS detecta que no se hace referencia a ningún tipo dentro de un conjunto al que se hace referencia en el código, no copiará el ensamblado al que se hace referencia, incluso si se agrega como referencia con Copy Local = True. No creo que sea el caso. Crear una solución ficticia que haga exactamente eso incluye el ensamblaje no utilizado en el contenedor. Es posible que desee intentar construir su solución con msbuild y establecer la verbosidad en el diagnóstico para ver exactamente lo que está sucediendo. – vcsjones

+0

Tienes razón, gracias a las versiones de framework (¿ediciones?) En lugar de usarlas o no. La coincidencia de que en mi configuración de prueba había agregado 2, uno usado y otro no, ambos casi idénticos, aparte de la 'edición' del marco. –

Respuesta

5

Aha .. el ensamblado al que se hace referencia se dirigió a .NET Framework 4.0, pero el ensamblado de referencia estaba dirigido a la versión de Client Profile de .NET 4.0.

La referencia fue agregada, apareció, sin problemas ni advertencias (desde la interfaz de usuario o VS al menos), pero I no se pudo referirse a ella en el código, y no aparecería en la salida.

Si alguien tiene ideas sobre por qué esto pasó desapercibido, ¿quizás me lo podrían decir?

+0

Si observa el resultado de compilación, definitivamente habrá algo, el problema es que es solo una advertencia (y es posible que deba obtener algo para tratar las advertencias como errores). Los MS son muy malos acerca de las fallas silenciosas como esta en lugares como, por ejemplo, si elimina un proyecto de un archivo sln irá y lo compilará con las propiedades actuales y dejará solo la más mínima pista cuando active el nivel de salida de MSBuild en Detailed) –

7

Si implementa/copia una aplicación que contiene una referencia a un componente personalizado que está registrado en el GAC, el componente no se implementará ni copiará con la aplicación, independientemente de la configuración de Copiar local.See MSDN

Tiene que forzar copiar local a verdadero agregando Metadatos privados a la referencia de ensamblado GAC. Editar el archivo de proyecto y añadir privada metadatos:

<Reference ..> 
    <Private>True</Private> 
</Reference ..> 

<ProjectReference ..> 
    <Private>True</Private> 
</ProjectReference ..> 

Ahora su montaje GAC se debe copiar/bajó de la carpeta de salida.

+0

¿Es posible hacerlo a través de Visual Studio? No quiero que los desarrolladores menores editen manualmente los archivos de proy. – BozoJoe

+0

No. Compruebe las propiedades de su referencia en VS – Ludwo

Cuestiones relacionadas