代码之家  ›  专栏  ›  技术社区  ›  urig

为什么powershell无法构建我的.net解决方案?(“另一个进程正在使用文件”)

  •  5
  • urig  · 技术社区  · 15 年前

    我已经编写了一个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抱怨另一个进程正在使用该文件。

    我怎样才能避免这种情况发生?有没有更好的例子可以通过powershell构建.net解决方案?

    3 回复  |  直到 12 年前
        1
  •  14
  •   Keith Hill    15 年前

    不要使用invoke表达式。只需直接在sln文件上调用devenv.exe(或者在没有安装程序或其他不支持的项目类型的情况下,只需使用msbuild.exe)。使用shell脚本语言的优点之一是,它们被设计成与控制台exe相当无缝地协同工作。我们总是在powershell脚本中执行此操作:

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

    我们通过out字符串运行输出,这样日志文件输出就不会换行80或120个字符(运行脚本的控制台的默认宽度)。

        2
  •  3
  •   stej    15 年前

    那是因为devenv在后台运行。你必须运行它并等待它完成。

    这应该有效:

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

    我也用它来构建我的解决方案。

        3
  •  -1
  •   bensiu CandorZ    12 年前

    System.dll的1684和1606

    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。我可以通过。