代码之家  ›  专栏  ›  技术社区  ›  Milan Gardian

如何从Powershell运行MSBuild而不生成MSBuild.exe进程?

  •  12
  • Milan Gardian  · 技术社区  · 17 年前

    我正在考虑通过直接点击MSBuild程序集从Powershell脚本运行MSBuild(而不是查找MSBuild安装路径并将MSBuild.exe作为子进程启动)。

    有人做过这个吗?运行构建的最简单、最直接的方法是什么?你想指出这两种技术的优缺点吗?(我对在与脚本其余部分相同的进程/appdomain中运行msbuild可能出现的任何问题特别感兴趣)。

    目前,我的想法大致如下:

    [void][System.Reflection.Assembly]::Load('Microsoft.Build.Engine, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
    [void][Microsoft.Build.BuildEngine.Engine]::GlobalEngine.BuildProjectFile("path/main.proj")
    
    5 回复  |  直到 17 年前
        1
  •  14
  •   Milan Gardian    17 年前

    [void][System.Reflection.Assembly]::Load('Microsoft.Build.Engine, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
    $engine = New-Object Microsoft.Build.BuildEngine.Engine
    $engine.RegisterLogger((New-Object Microsoft.Build.BuildEngine.ConsoleLogger))
    $engine.BuildProjectFile('fullPath\some.proj')
    

    然而,事实证明,将MSBuild直接嵌入Powershell(V1)是有问题的:

    'MSBUILD : warning MSB4056: The MSBuild engine must be called on
    a single-threaded-apartment. Current threading model is "MTA".
    Proceeding, but some tasks may not function correctly.'
    

    为什么,哦,为什么我们在管理环境中工作时,在2009年仍然要缴纳COM税?

    [void][System.Reflection.Assembly]::Load('Microsoft.Build.Utilities.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
    $msbuild = [Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToDotNetFrameworkFile("msbuild.exe", "VersionLatest")
    &$msbuild fullPath\some.proj
    
        2
  •  5
  •   EBGreen    17 年前

    PSake .

    请记住,psake是PowerShell周围的语法糖。因此,在PowerShell中可以执行的任何操作,都可以在psake中执行。这意味着您可以运行MSBuild、NAnt或其他脚本。无需完全替换当前的构建系统。你可以使用psake来自动化和扩展它!

    psake会自动添加相应版本的。NET Framework的路径。因此,您可以访问MSBuild、csc.exe、vbc.exe或安装在$env:windir\Microsoft中的任何其他工具。NET\Framework\$version\没有完全限定的路径。

        3
  •  3
  •   JaredPar    17 年前

        4
  •  3
  •   Anthony Potts    17 年前

    我一直在寻找同样的东西。在JaredPar的带领下,我发现了以下内容:

    http://bartdesmet.net/blogs/bart/archive/2008/02/03/easy-windows-powershell-cmdlet-development-and-debugging.aspx

    Microsoft.Build.Framework
    
    Microsoft.Build.BuildEngine
    

    MSBuild文档可以在这里找到(这更多的是为了完整性,而不是为了回答您的问题):

    http://msdn.microsoft.com/en-us/library/wea2sca5.aspx

        5
  •  0
  •   hypersw    13 年前

    从前,我一直在玩运行增强的MSBuild构建过程(比如,更积极地跳过构建的某些部分)。

    有两种选择:

    1. 通过加载MSBuild的DLL,在您自己的进程中宿主MSBuild。
    2. 以常规方式生成MSBuild.exe,然后注入其中(例如,记录器提供了一种不错的方式)。

    例如,MSBuild的.config文件中有大量程序集绑定重定向。

    Visual Studio进程( devenv.exe devenv.exe.config .我的 .exe.config 也必须有这些,但它会使您遵循特定的MSBuild版本。当然,你必须修改配置。这实际上不是PS的选择,所以我怀疑你是否能得到一个真正稳定的解决方案。