我如何在我的程序运行的机器上编写代码以获取MSBuild路径?
我可以从环境中获取 .NET 版本,但是否有一种方法可以获取特定 .NET 版本的正确文件夹路径?
如果你很有冒险精神,现在你可以从GitHub获取MsBuild的源代码和最新版本,链接为https://github.com/Microsoft/msbuild/releases/
获取最新版本的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;
}
如果您想编译一个 Delphi 项目,请查看使用 msbuild+Delphi2009 时出现的 "ERROR MSB4040 项目中没有目标"
正确的答案是:有一个批处理文件叫做rsvars.bat(在 RAD Studio 文件夹中搜索)。在调用 MSBuild 之前调用它,它将设置必要的环境变量。如果编译器位于默认位置以外,请确保 rsvars.bat 中的文件夹是正确的。
这个批处理文件不仅会更新 PATH 环境变量到正确的 .NET 文件夹和正确的 MSBuild.exe 版本,还会注册其他必要的变量。