52

Tengo una aplicación ASP.NET MVC 2.Visual Studio 2010 Publicar Web característica que no incluye todas las DLL

proyecto Web
  • contiene una referencia a SomeProject
  • SomeProject contiene referencias a ExternalAssembly1 y ExternalAssembly2.
  • SomeProject llama explícitamente a ExternalAssembly1, pero NO ExternalAssembly2.
  • ExternalAssembly1 pone en ExternalAssembly2

Al realizar construir un local de todo es fresco. Todos los archivos DLL se incluyen en la carpeta bin \ debug. El problema es que cuando uso el comando Publicar web en Visual Studio 2010, despliega todo, excepto ExternalAssembly2.

Parece que se ignoran los ensamblados que no se usan directamente (recuerde, ExternalAssembly2 solo lo usa ExternalAssembly1).

¿Hay alguna manera en que pueda decirle a Visual Studio 2010 que incluya ExternalAssembly2?

Puedo escribir un método ficticio que llame a ExternalAssembly2. Esto funciona, pero realmente no quiero tener código ficticio con el único propósito de hacer que VS2010 publique la DLL.

+0

¿Has probado esto en VS 11? Lo probé y parecía que estaba funcionando. Si encuentra que todavía no funciona, ¿me puede enviar un correo electrónico a sayedha {at} (microsoftDOTcom)? ¡Gracias! FYI si encuentra que una gran cantidad de ensamblajes no lo están haciendo bin \, luego reconstruya su solución en la misma configuración de compilación utilizada en el diálogo de publicación, luego publíquelo de nuevo. Ese fue otro error que ya se ha solucionado. –

+1

Siéntase libre de ignorar mi comentario anterior, fue un error del usuario de mi parte. Ahora puedo reproducir esto y me doy cuenta de que es un problema. En este punto, no estoy seguro de qué se puede hacer aquí, pero quiero que sepan que estoy investigando esto. –

+0

@SayedIbrahimHashimi gracias por seguir – manu08

Respuesta

2

Si accedes a la lista de propiedades de referencia ExternalAssembly2 y cambias "Copiar local" a "Verdadero", creo que eso podría resolver tu problema.

+0

Gracias por la respuesta, pero eso ya está establecido (razón por la cual la construcción local funciona). Esto no resuelve el problema de publicación. – manu08

7

Tengo este mismo problema (aunque con diferentes ensamblajes). Si hago referencia a los ensamblados en mi proyecto web, se incluirán en el resultado de publicación, pero se deben incluir de todos modos porque son dependencias indirectas:

Proyecto web ---> Ensamblaje A ---> Ensamblaje B

En la compilación, los conjuntos A y B se superan en la carpeta \ bin. En publicación, solo el ensamblaje A está superado en la carpeta de publicación.

He intentado cambiar la configuración de publicación para incluir todos los archivos en el proyecto web, pero luego tengo archivos en mi salida de publicación que no deberían implementarse.

Esto me parece un error.

+0

Estoy de acuerdo. Por ahora, creo que me voy a ir en el método ficticio que simplemente llama a cada DLL que necesito para ser publicado. – manu08

3

Mis pruebas muestran que los ensamblajes externos se publican cuando tengo una referencia sobre ellos en el proyecto web. No tengo que escribir ningún código ficticio para que funcione. Esto me parece aceptable.

Estoy de acuerdo con Nicholas que esto parece ser un error en Visual Studio. Al menos me escapa cuál podría ser el motivo del comportamiento.

+0

Aún así es un truco. No debería tener que hacer referencia a conjuntos en mi proyecto web que no se usan en el proyecto web. ¿Qué sucede en 6 meses cuando decidimos limpiar las referencias de ensamblajes no utilizados? – manu08

2

No sé si está viendo esto todavía, pero encontré la solución (tuve el mismo problema) a través de this MSDN article.En "crear acción" para el archivo, elija "Contenido" que debe incluirlo en la lista de archivos que publica.

+0

Gracias. Voy a probarlo cuando tenga la oportunidad y actualizar en consecuencia – manu08

+0

Esto parece funcionar, pero de nuevo, si VS2010 puede averiguar lo que necesita copiar en bin \ debug para ejecutar, debe usar la misma lógica (al menos para el conjunto mínimo de archivos) cuando se publica. – manu08

+0

¿Cómo funciona esto para los ensambles a los que se hace referencia? No hay una opción 'Crear acción' para una referencia. – syclee

0

Tengo el mismo problema y este es un error VS2010 si hay un enlace de referencia como: Proyecto web -> proyecto personalizado -> assembly1 -> (indirectamente) assembly2.

Por ahora me parece que si hago referencia al Ensamblaje1 en el proyecto web, entonces assembly2 se incluye en la carpeta bin. Así que tuve que agregar un enlace de referencia adicional como: Proyecto web -> assembly1 -> (indirectamente) assembly2. Entonces VS puede reconocer assembly2 e incluir su archivo dll en acción de publicación.

3

He creado este problema como un error en Microsoft Connect. Si alguien lo experimenta puede votarlo https://connect.microsoft.com/VisualStudio/feedback/details/637071/publish-web-feature-not-including-all-dlls y con suerte vamos a hacer algo al respecto.

+0

Parece que lo han cerrado como * No reproducible * ya que nadie tuvo la oportunidad de cargar una solución de muestra. También me he encontrado con este problema, intentaré crear una pequeña solución de "reproducción" para que investiguen. – Intruder

+0

Chicos esto No estoy seguro de por qué el sitio web de conexión muestra esto como No reproducible. En los comentarios que mencioné (sobre la semana pasada después del comentario anterior) que no pude reproducir, pero pedí más información. Estoy activamente investigando esto. Trabajaré para obtener el estado actualizado en Connect. –

1

Tengo el mismo tipo de problema con un proyecto web. Tengo un proyecto web que hace referencia al ensamblaje A que hace referencia al ensamblado B. Funcionó bien durante un tiempo, pero hoy se rompió. Hice una reconstrucción de la solución y esta vez desplegó todo correctamente.

1

Tuve el mismo problema hoy. Publiqué mi proyecto web y me di cuenta de que no todas las DLL de referencia estaban allí. En particular, las referencias DLL indirectas.

Resulta que el directorio en el que estaba publicando estaba fuera de espacio en disco (recurso compartido de red). Tenía el espacio suficiente para publicar todos los archivos, a excepción de algunos DLL indirectos de referencia. La parte triste es que VS08 no arrojó ningún error. Acaba de publicar que los archivos son habituales. Limpié un poco del espacio de HDD y todo funcionó bien.

No encontré el problema de espacio en el HDD hasta que intenté mover manualmente el archivo DLL.

6

Tuve el mismo problema con VS2010 y una aplicación de servicio WCF.

Resulta que si sus DLL (directa o indirectamente) referenciadas se implementan en GAC, la característica de publicación VS las excluye. Una vez que eliminé los ensamblados de GAC, la función de publicación comenzó a funcionar como se esperaba.

Supongo que VS está asumiendo que si sus ensamblajes pueden ubicarse en GAC en la máquina que construye, también se ubicarán en GAC en la máquina de destino. Al menos en mi caso, esta suposición es falsa.

1

en mi caso es bastante complicado. No es necesario hacer referencia al ExternalAssembly2 para compilar el proyecto, pero es vital para el tiempo de ejecución ya que usamos el reflejo para configurar el contenedor de Unity. Por lo tanto, borro la referencia: construyo el proyecto con éxito, pero obtengo un error en tiempo de ejecución. Si conservo la referencia, puedo compilar y ejecutar la aplicación pero no puedo publicarla con ExternalAssembly2; también obtengo una excepción de tiempo de ejecución. Esto sucede debido a la optimización interna de ensambles VS2010.

Entonces, ¿qué podemos hacer aquí? 1.Ponga un poco de código de pieza no requerido para usar cualquier clase de ExternalAssembly2. 2. escape de la reflexión y utilice conjuntos estáticos de enlace.

Espero que esto ayude a smbd.

2

Copiar local hizo el truco. Tuve un problema que el ensamblaje Newtonsoft.Json se incluyó en el paquete deploymeny. Copiar local se configuró en falso.

Cuestiones relacionadas