2010-04-01 19 views
5

He escrito un script de PowerShell para compilar varias soluciones .net una después de la otra. Simplemente hace varias llamadas a tfget (para obtener las últimas) seguido de llamadas a devenv.exe (para compilar los archivos .sln).¿Por qué PowerShell no puede construir mis soluciones .net? ("el archivo está siendo utilizado por otro proceso")

Aquí está el código:

tfget -item $SolutionPath -overwrite -recurse -ev +errors 
... 
$out = invoke-expression "devenv.com /rebuild debug $SolutionPath" 

Casi cada vez que ejecute el guión una de las soluciones para construir falla y me da un error de CSC.exe diciendo (?):

de error CS1606: error en la firma de ensamblaje; La salida no puede estar firmada: el proceso no puede acceder al archivo porque está siendo utilizado por otro proceso.

Esto sucede a pesar de que he cerrado todas las instancias de Visual Studio que contienen estas soluciones y no tengo ninguno de sus archivos ejecutados en mi máquina.

Un archivo de lote similar que he escrito funciona bien. Solo PowerShell se queja del archivo que está utilizando otro proceso.

¿Cómo puedo evitar que esto suceda? ¿Hay algún ejemplo mejor de construir soluciones .net a través de PowerShell?

+0

¿Puedes pegar tu código? – stej

+0

Hola Stej, acabo de actualizar la pregunta para incluir una muestra de código. – urig

+0

¿Existe alguna razón específica por la que desee usar devenv.exe para compilar en lugar de MSBuild? – Filburt

Respuesta

14

No utilice invoke-expression. Simplemente llame a devenv.exe directamente en el archivo SLN (o simplemente use MSBuild.exe a menos que tenga configuración u otros tipos de proyectos no compatibles). Una de las ventajas de usar un lenguaje de script shell es que están diseñados para funcionar con consola de forma bastante fluida. Hacemos esto todo el tiempo en los scripts de PowerShell:

msbuild.exe "R:\Source\Foo.sln" /t:build /p:Configuration=Debug ` 
    /v:detailed 2>&1 | Out-String -stream -width 1024 > $DebugBuildLogFile 

Nos ejecutar a traves de Out-String para que la salida del archivo de registro no se ajusta a 80 o 120 caracteres (ancho predeterminado de la consola que se ejecuta la secuencia de comandos)

+1

Funciona como un encanto, gracias. Solo debo añadir que el msbuild.exe puede encontrarse normalmente en la carpeta .NET Framework, por ejemplo: C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ msbuild.exe – urig

3

Eso es porque devenv se está ejecutando en segundo plano. Tienes que ejecutarlo y esperar hasta que termine.

Esto debería funcionar:

$p = Start-Process -FilePath devenv -ArgumentList $solutionPath,"/Rebuild Debug" -PassThru 
$null = $p.WaitForExit(-1) 

lo uso para construir mis soluciones también.

+0

My PowerShell (v2.0) se queja de que debería usar -File en lugar de -FilePath y -Arguments en lugar de -ArgumentList. Ahora estoy atascado porque me dice que $ solutionPath es del tipo object [] y debe ser del tipo string :) – urig

+0

Scratch that. Parece que mi PS está ejecutando el Cmdlet Start-Process incorrecto. Tengo PSCX instalado y PS está ejecutando la versión PSCX 'de Start-Process de forma predeterminada. Comenzaré una nueva pregunta de SO para saber cómo hacer que PS use la versión correcta. – urig

+0

Ok, buena suerte. Como he visto, hay algunas soluciones;) – stej

0

1684 y 1606 para system.dll

step 1: Remove [ control panal-> Microsoft .NET Framework 3.5 SP1 and KB976769v2 under Microsoft .NET Framework 3.0 Service Pack 2] 

step 2: windows update-> express-> .NET versions 2.0 through 3.5 (KB951847) x86. 

luego hacer el msbuild nuevo. Puedo pasar.

Cuestiones relacionadas