我正在编写一个应用程序来评估(但不构建)*.csproj 和其他项目文件。
该应用程序模拟 MSBuild 所做的事情。它使用Microsoft.Build.dll
实例公开的(记录在案的)公共 API,这些 API 安装在 Visual Studio 文件夹中,例如:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\
在这些目录中有一个MSBuild.exe.config
文件,其中包含如下msbuildToolsets
部分:
<msbuildToolsets default="Current">
<toolset toolsVersion="Current">
<property name="MSBuildToolsPath" value="$([MSBuild]::GetCurrentToolsDirectory())" />
<property name="MSBuildToolsPath32" value="$([MSBuild]::GetToolsDirectory32())" />
<property name="MSBuildToolsPath64" value="$([MSBuild]::GetToolsDirectory64())" />
<property name="MSBuildSDKsPath" value="$([MSBuild]::GetMSBuildSDKsPath())" />
<property name="FrameworkSDKRoot" value="$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\NETFXSDK\4.8@InstallationFolder)" />
<property name="MSBuildRuntimeVersion" value="4.0.30319" />
<property name="MSBuildFrameworkToolsPath" value="$(SystemRoot)\Microsoft.NET\Framework\v$(MSBuildRuntimeVersion)\" />
... etc ...
这些条目定义了在评估 *.csproj 时设置的全局变量的值。
在dotnet/msbuild 源代码中,我看到:
- 在类中(在命名空间中)
GetMSBuildSDKsPath()
定义了一个类似的函数,它是一个类。IntrinsicFunctions
Microsoft.Build.Evaluation
internal static
- 这个函数的实现委托给
BuildEnvironmentHelper
(在Microsoft.Build.Shared
命名空间中),它也是一个internal
类。
在调用 MSBuild 时正确设置这些全局变量至关重要,例如在调用ProjectCollection.LoadProject
方法以返回Project
实例时(否则项目将不会加载)。
设置这些变量的 API 是通过globalProperties
参数将它们传递给ProjectCollection
-- 但我不知道如何获取或评估我应该设置的这些属性的值。
我的问题是——我怎样才能读取这些变量(假设上面列出的类是“内部”)?是否有一个公共 API 可以做到这一点?
如有必要,我可以在 MSBuild bin 文件夹中运行我的应用程序,和/或复制MSBuild.exe.config
文件。