2010-01-07 15 views
12

Cuando utiliza el sitio web ASP.NET (en lugar del modelo de aplicación web) y agrega referencia a un ensamblado de la carpeta local, Visual Studio, al parecer, entiende que este ensamblado local también está en GAC y por lo tanto NO copia este ensamblado a carpeta bin (como lo hace con los ensamblajes que no son GAC), pero simplemente agrega un nuevo registro en el archivo web.config.¿Por qué el conjunto de referencia de sitio web ASP.NET de GAC, al agregar referencia local?

¿Por qué un comportamiento así? ¿Es posible obligar a copiar a la carpeta bin (lo necesito ya que .dll no está en el entorno de destino)? Puedo agregar el ensamblado a la carpeta bin como archivo y funcionará, pero en este caso el contenido de la carpeta bin estará en control de fuente, lo cual no es bueno.

Respuesta

12

Puede establecer la propiedad Copiar local en True en la referencia. Eso debería agregarlo a la carpeta bin, en un proyecto de aplicación web.

Pero para un proyecto de sitio web, cuando agrega una referencia, todo lo que hace es agregar una línea al web.config que hace referencia al ensamblado. Primero buscará este archivo en la carpeta bin, y luego en el GAC si no se encuentra.

Tiene dos opciones: requiere que el ensamblaje se instale en el GAC en la máquina de destino (en este caso, la implementación de XCOPY no es posible) o incluye todos los ensamblajes necesarios en la carpeta bin, ya sea copiando o escribiendo un script post-build que lo hace. Puede encontrar el .dll utilizando el símbolo del sistema y yendo a c: \ windows \ assembly \ GAC, busque el ensamblado que le interesa, cd en ese directorio y luego cd en el directorio con la versión que le interesa. Esto le dará la ruta para usar en su script post-compilación. Por ejemplo, para el montaje de Accesibilidad en la GAC, que terminarías con esta ruta: c: \ Windows \ assembly \ GAC \ Accesibilidad \ 1.0.5000.0__b03f5f7f11d50a3a \ Accessibility.dll

Usted dice que incluye la carpeta bin el contenido en el control de la fuente no es bueno. En general, esto se considera cierto para los archivos binarios que compila, pero en su caso, tiene activos binarios que no se compilan como parte de su proyecto. Filosóficamente, estos son equivalentes a imágenes: activos binarios no compilados como parte de su proyecto. Yo diría que pertenecen tanto al control de código fuente como a cualquier otro binario en el que confíe su proyecto. Pero es una elección personal.

+0

¿Cómo puedo establecer esta propiedad? Cuando abro Páginas de propiedades del sitio web, veo una lista de referencias, pero Copiar local no está disponible allí. Tenga en cuenta que este es el sitio web (no la aplicación web) – Konstantin

+0

Es propiedad de la referencia, no del sitio web. Pero ahora veo por qué estás especificando que es un sitio web y no una aplicación web. Editaré mi respuesta. – Don

+0

He marcado esta respuesta como aceptada, gracias Don! Sin embargo, todavía no entiendo la lógica de VS, si agrego ensamblado local, ¿por qué buscarlo en GAC y luego referenciarlo desde el GAC? – Konstantin

4

En tiempo de ejecución, los ensamblados deben estar en una de dos ubicaciones: la ruta de salida del proyecto o la caché de ensamblaje global (consulte Trabajar con ensamblados y Caché de ensamblados global). Si el proyecto contiene una referencia a un objeto que no está en una de estas ubicaciones, cuando se construye el proyecto, la referencia debe copiarse en la ruta de salida del proyecto. La propiedad CopyLocal indica si esta copia debe realizarse. Si el valor es verdadero, la referencia se copia. Si es falso, la referencia no se copia.

El valor asignado-proyecto de CopyLocal se determina en el siguiente orden:

  1. Si la referencia es otro proyecto, denominado una referencia-proyecto a proyecto, entonces el valor es cierto.
  2. Si el ensamblado se encuentra en la memoria caché de ensamblaje global, el valor es falso.
  3. Como un caso especial, el valor de la referencia de mscorlib.dll es falso.
  4. Si el ensamblado se encuentra en la carpeta Framework SDK, el valor es falso. De lo contrario, el valor es verdadero.

Esperanza esto ayuda

s

6

Si está utilizando un proyecto de sitio web en Visual Studio y una referencia lo sigue apuntando a la versión GAC en lugar de a otra carpeta (por ejemplo, lib), tendrá que crear un xxxx.dll.refresh en su carpeta/bin, donde xxxx es el dll ofensor al que hace referencia.

Esto resolverá los problemas de compilación con MSBuild también, donde el servidor esperará que el dll esté en el GAC. El archivo .refresh obtendrá el archivo de la ruta relativa correcta para hacer construcciones correctamente.

Cuestiones relacionadas