2009-07-22 13 views
17

Mi solución de estudio visual incluye una aplicación web y una aplicación de prueba de unidad. Mi aplicación web usa log4net. Quiero poder usar msbuild desde la línea de comandos para construir mi solución. Sin embargo, siempre que construyo la solución desde la línea de comandos, obtengo errores de compilación porque no puede copiar log4net.xml en el directorio bin del proyecto de prueba.¿Cómo puedo evitar que Visual Studio bloquee los archivos de documentación xml en el directorio bin?

El mensaje de error es:.

"No se puede copiar el archivo '\ bin \ log4net.xml' a 'bin \ Debug \ log4net.xml' acceso a la ruta '\ bin \ log4net.xml ' es denegado."

Parece que Visual Studio está bloqueando este archivo, pero no entiendo por qué sería necesario. ¿Hay alguna manera de evitar que VS bloquee los archivos de documentación XML en un proyecto que ha cargado?

Respuesta

1

que he tenido este problema con Visual Studio, también. Usamos NAnt en lugar de MSBuild, pero el problema es el mismo. Pude solucionar el problema modificando el archivo de compilación para ignorar los fallos al copiar la documentación xml.

Tenga en cuenta que esto no resuelve el problema original ya que los archivos xml todavía están bloqueados, pero esta solución fue suficiente para nosotros ya que el contenido real de nuestra documentación xml no cambia muy a menudo.

0

Básicamente no verifique los archivos en la carpeta bin, es una mala idea.

Puede colocar este archivo en otro directorio y hacer referencia desde allí o colocar el código que lo usa en una biblioteca y hacer que el evento de compilación posterior lo copie en su directorio bin y luego haga referencia.

MSBUILD luego copiará que en el directorio bin webprojects para ti :)

tenemos este problema exacto con personas que se registran en la materia al directorio bin, a menos que sea absolutamente necesario directorios bin debe o no ser registrado en absoluto o simplemente tenga archivos .refresh allí para evitar este tipo de problemas de bloqueo.

poco tarde en la respuesta, lo siento :)

+0

La pregunta original no indicaba que cualquier los archivos se registraron en el directorio bin, solo que se copiaron allí durante la compilación. Dicho esto, acepto que, en general, los archivos no deben registrarse en el directorio bin de un proyecto. –

+0

Ah, disculpa por eso, lo he vuelto a leer y tienes razón :) Sin embargo, me resulta muy incómodo que no puedas usar eventos de compilación previa y previa en este tipo de proyectos, al final terminé resolviendo el problema teniendo un directorio de dependencias y msbuild siempre copia el ensamblado correctamente. –

1

Krystan escribió:

que podría caer este archivo en otro directorio y hacer referencia a ella desde allí o código de lugar que lo utiliza en una biblioteca y tener el evento posterior a la construcción en ese copiarlo a su directorio bin y luego referencia.

Nuestro problema de bloqueo de archivos xml no está en el directorio bin de proyectos, sino en un directorio de referencia externo. Lo pulsamos al realizar TortoiseSVN-> Actualizar donde hay una nueva versión disponible. Asumiendo que es porque VS está usando el archivo para intellisense.

Para aquellos que aciertan a este problema de bloqueo debido a TortoiseSVN-> Update, actualmente estoy experimentando con un gancho de pre-actualización que borra los archivos ofensivos antes de actualizarlos (se restaurarán si no se necesita ninguna actualización) , hasta ahora esto parece funcionar (lo cual es raro) pero no lo he probado lo suficiente como para decirlo con seguridad. Actualizará esta respuesta si resulta confiable.

Esperamos que MS lo solucione en VS 2010.

+0

Estoy enfrentando el mismo problema. Su solución alternativa funciona bien, pero es extraño que TSVN acn elimine el archivo, ¡pero no lo sobrescriba! –

8

que he encontrado la siguiente solución: En caso VS postbuild o en escritura de NAnt/MSBUILD ejecutar el script cmd

handle.exe -p devenv [Path to the folder with locked files] > handles.txt 

FOR /F "skip=5 tokens=3,4 delims=: " %%i IN (handles.txt) DO handle -p %%i -c %%j -y 

Handle.exe está disponible aquí http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx

primera línea del script vuelca a handles.txt todos los identificadores para archivos bloqueados por VS segunda línea lee los identificadores del identificador desde el archivo y mata los identificadores

Después de ejecutar el script, los archivos pueden ser rem oved/replace/moved etc

+0

excelente respuesta. funciona como un amuleto y me permite escribir mis scripts de compilación como si Visual Studio se comportara en lugar de escribir mis scripts de compilación alrededor de un VS que se porta mal. – Adam

+1

Estoy usando Handle 3.46 y tuve que cambiar 'tokens = 3,4' por' tokens = 3,6'. Después de eso funcionó perfectamente gracias. – OlduwanSteve

2

Si no tiene problemas para omitir los archivos xml & pdb de la salida, puede pasar /p:AllowedReferenceRelatedFileExtensions=none a msbuild en la línea de comandos.

(Gracias a la respuesta relacionada https://stackoverflow.com/a/8757941/251011)

EDIT: Si también tiene problemas con archivos DLL que tiene este error, recientemente he descubierto una solución variable de entorno: https://stackoverflow.com/a/23069603/251011

+1

También: Es un poco entretenido que después de casi cinco años VS todavía se bloquea así y todavía no sabemos * por qué *. –

Cuestiones relacionadas