Почему PowerShell не может создать мои решения .net? («файл используется другим процессом») - PullRequest
5 голосов
/ 01 апреля 2010

Я написал сценарий PowerShell для создания нескольких решений .net одно за другим.Он просто делает несколько вызовов tfget (чтобы получить последнюю версию), а затем вызывает devenv.exe (для создания файлов .sln).

Вот код:

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

Почти каждый разЯ запускаю сценарий, одно из решений не может быть построено, и я получаю сообщение об ошибке CSC.exe (?), В котором говорится:

ошибка CS1606: Ошибка подписи сборки;выходные данные могут быть не подписаны - процесс не может получить доступ к файлу, потому что он используется другим процессом.

Это происходит, даже если я закрыл все экземпляры Visual Studio, содержащие эти решения, и я 'Ни один из их exe-файлов не запущен на моей машине.

Подобный командный файл, который я написал, прекрасно работает.Только PowerShell жалуется на использование файла другим процессом.

Как можно избежать этого?Есть ли лучшие примеры построения решений .net с помощью PowerShell?

Ответы [ 3 ]

14 голосов
/ 02 апреля 2010

Не используйте invoke-выражение. Просто вызовите devenv.exe непосредственно в файле SLN (или в этом случае просто используйте MSBuild.exe, если у вас нет настроек или других неподдерживаемых типов проектов). Одна из прелестей использования языка сценариев оболочки - то, что они предназначены для простой работы с консольными файлами. Мы делаем это все время в скриптах PowerShell:

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

Мы запускаем вывод через Out-String, чтобы вывод файла журнала не переносился на 80 или 120 символов (ширина консоли по умолчанию для запуска сценария).

3 голосов
/ 01 апреля 2010

Это потому, что devenv работает в фоновом режиме. Вы должны запустить его и подождать, пока он не закончится.

Это должно работать:

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

Я также использую его для построения своих решений.

0 голосов
/ 28 декабря 2010

1684 и 1606 для 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.

затем снова выполните msbuild. Я могу пройти.

...