MSBuild的路径

217

我如何在我的程序运行的机器上编写代码以获取MSBuild路径?

我可以从环境中获取 .NET 版本,但是否有一种方法可以获取特定 .NET 版本的正确文件夹路径?

23个回答

-1

不回答任何提问者的问题。 - Alan Macdonald
当你可以创建到MsBuild.exe的链接时,这似乎有些笨重。或者只需将现有副本之一复制到任何您喜欢的地方,或将其添加到PATH中。(在我使用不到3个月的机器上已经有20个MS Spam的副本了,所以这不会是我的第一选择) - Andrew Dennison

-1

获取最新版本的MsBuild。 对于所有类型的msbuild安装,针对不同的处理器架构(Power Shell)是最好的方法:

function Get-MsBuild-Path
{
    $msbuildPathes = $null
    $ptrSize = [System.IntPtr]::Size
    switch ($ptrSize) {
        4 {
            $msbuildPathes =
            @(Resolve-Path "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\*\*\MSBuild\*\Bin\msbuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:ProgramFiles(x86)}\MSBuild\*\Bin\MSBuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:windir}\Microsoft.NET\Framework\*\MSBuild.exe" -ErrorAction SilentlyContinue)
        }
        8 {
            $msbuildPathes =
            @(Resolve-Path "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\*\*\MSBuild\*\Bin\amd64\msbuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:ProgramFiles(x86)}\MSBuild\*\Bin\amd64\MSBuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:windir}\Microsoft.NET\Framework64\*\MSBuild.exe" -ErrorAction SilentlyContinue)
        }
        default {
            throw ($msgs.error_unknown_pointersize -f $ptrSize)
        }
    }

    $latestMSBuildPath = $null
    $latestVersion = $null
    foreach ($msbuildFile in $msbuildPathes)
    {
        $msbuildPath = $msbuildFile.Path
        $versionOutput = & $msbuildPath -version
        $fileVersion = (New-Object System.Version($versionOutput[$versionOutput.Length - 1]))
        if (!$latestVersion -or $latestVersion -lt $fileVersion)
        {
            $latestVersion = $fileVersion
            $latestMSBuildPath = $msbuildPath
        }
    }

    Write-Host "MSBuild version detected: $latestVersion" -Foreground Yellow
    Write-Host "MSBuild path: $latestMSBuildPath" -Foreground Yellow

    return $latestMSBuildPath;
}

很明显,这在第一个x64版本的VS 2022中已经失效了。 - Lex Li

-2

如果您想编译一个 Delphi 项目,请查看使用 msbuild+Delphi2009 时出现的 "ERROR MSB4040 项目中没有目标"

正确的答案是:有一个批处理文件叫做rsvars.bat(在 RAD Studio 文件夹中搜索)。在调用 MSBuild 之前调用它,它将设置必要的环境变量。如果编译器位于默认位置以外,请确保 rsvars.bat 中的文件夹是正确的。

这个批处理文件不仅会更新 PATH 环境变量到正确的 .NET 文件夹和正确的 MSBuild.exe 版本,还会注册其他必要的变量。


那个答案与Delphi无关,对于Delphi用户来说也不更加健壮。 - Nashev
3
抱歉我说话简洁。我的意思是更加全面,适用于不仅仅是Delphi。可能在Delphi中有更简单的方法,但是原帖并没有询问Delphi,而且该帖已经有18个回答,很少有人会看到。如果您认为让其他人看到这一点很重要,我建议您创建一个针对Delphi的新问题,并自行回答。如果我们能够将回答数降至6个或更少,并覆盖每个版本的MSBuild,那我会非常高兴。 - jpaugh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接