2010-04-01 15 views
5

Ho scritto uno script PowerShell per creare diverse soluzioni .net una dopo l'altra. Fa semplicemente diverse chiamate a tfget (per ottenere l'ultima) seguita da chiamate a devenv.exe (per creare i file .sln).Perché PowerShell non riesce a creare le mie soluzioni .net? ("il file viene utilizzato da un altro processo")

Ecco il codice:

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

Quasi ogni volta che faccio funzionare lo scritto una delle soluzioni non riesce a costruire e ottengo un errore da Csc.exe dire (?):

errore CS1606: la firma dell'assembly non è riuscita; L'output potrebbe non essere firmato: il processo non può accedere al file perché viene utilizzato da un altro processo.

Ciò accade anche se ho chiuso tutte le istanze di Visual Studio che contengono queste soluzioni e non ho nessuno dei loro ex in esecuzione sul mio computer.

Un file batch simile che ho scritto funziona bene. È solo PowerShell che si lamenta del file utilizzato da un altro processo.

Come evitare che ciò accada? Esistono esempi migliori di soluzioni .net tramite PowerShell?

+0

È possibile incollare il codice? – stej

+0

Ciao stej, ho appena aggiornato la domanda per includere un esempio di codice. – urig

+0

Esiste un motivo specifico per cui si desidera utilizzare devenv.exe per la compilazione anziché MSBuild? – Filburt

risposta

14

Non utilizzare invoke-expression. Basta chiamare devenv.exe direttamente sul file SLN (o, per il resto, usa MSBuild.exe a meno che tu non abbia setup o altri tipi di progetti non supportati). Una delle bellezze dell'utilizzo di un linguaggio di scripting della shell è che sono progettate per funzionare senza problemi con gli ex console. Facciamo questo per tutto il tempo in script PowerShell:

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

Corriamo l'uscita attraverso Out-String in modo che l'output del file di registro non va a capo a 80 o 120 caratteri (larghezza di default della console che esegue lo script).

+1

Funziona come un incantesimo, grazie. Devo solo aggiungere che msbuild.exe può essere tipico trovato nella cartella .net framework, ad esempio: C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ msbuild.exe – urig

3

Ecco perché devenv è in esecuzione in background. Devi eseguirlo e attendere fino al termine.

Questo dovrebbe funzionare:

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

Io lo uso per costruire le mie soluzioni pure.

+0

My PowerShell (v2.0) si lamenta che dovrei usare -File invece di -FilePath e -Arguments invece di -ArgumentList. Ora sono bloccato perché mi dice che $ solutionPath è di tipo object [] e deve essere di tipo stringa :) – urig

+0

Scratch that. Sembra che il mio PS stia eseguendo il Cmdlet Start-Process sbagliato. Ho installato PSCX e PS sta eseguendo la versione di Start-Process di PSCX per impostazione predefinita. Inizierò una nuova domanda SO per scoprire come rendere PS utilizzare la versione corretta. – urig

+0

Ok, buona fortuna. Come ho visto ci sono alcune soluzioni;) – stej

0

1684 e il 1606 per 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. 

quindi ripetere la msbuild. Potrei passare.

Problemi correlati