问题描述
由于 VS 版本的一些差异,以及不同版本的 Roslyn 编译器,我想稍微自定义一个 CSPROJ 文件以在单个 C# 文件的多个版本之间切换,专用于特定版本的编译器.
CSPROJ 文件采用与此类似的“新的、简短的”XML 格式:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ProjectGuid>{..guid..}</ProjectGuid>
<RootNamespace>blah.blah</RootNamespace>
<AssemblyName>blah.blah</AssemblyName>
<AssemblyTitle>blah.blah/AssemblyTitle>
<Product>blah.blah</Product>
<TargetFramework>net462</TargetFramework>
<copyright>copyright © 2021</copyright>
<LangVersion>7.3</LangVersion>
</PropertyGroup>
<ItemGroup>
<packagereference Include="..." Version="..." />
<packagereference Include="..." Version="..." />
<packagereference Include="..." Version="..." />
</ItemGroup>
</Project>
所以没有所有文件的旧式列表等。这当然仍然是一个 MSBuild 项目文件,所以 PropertyGroups 和 ItemGroups 都接受 Condition='..'
选项,并且各种 $() 样式的 MSBuild 变量替换工作.
MSBuild、网络框架构建脚本和 VisualStudio 提供多个变量,例如:
- $(ProjectDir)
- $(OutDir)
获得这些变量的完整列表并不容易,因为只有少数是“保证”和“记录”的,其中大部分是内部构建系统变量。这个列表相当广泛,我能够找到几个汇编,例如:
我已经找到了 $(VisualStudioVersion)
变量,即使没有所有这些列表,但该变量仅返回触发构建系统的 VS 的主要版本。如果我有 VS 16.8,那么我只能从这个变量中得到“16.0”,这还不够,要进行自定义,我至少需要它的次要数字“16.8”。
我还发现了非常有前途的 $(MSBuildToolsversion)
,但这个只返回 Current
,没有版本信息。
我还可以将我的文件交换解决方案基于 CSC/Roslyn 版本标记,例如 3.8.0-5.20567.16 (53c5d7d3)
,因为 VS 的每个安装/补丁更新都带有特定的编译器版本,而 3.8.0
是一个偶数比 VS IDE 的 16.8
更好。但是除了在“VS 2019 的开发人员命令提示符”中运行 csc.exe
之外,我无法从 CSPROJ 结构中找到此信息
-
是否有任何 MSBuild/VisualStudio/ENV/etc $() 样式的变量包含有关 VS IDE 或 CSC/Roslyn 编译器的次要版本号的信息?
-
如果没有,那么也许有一种方法可以启动
csc.exe
,抓住它的标签行,并为遵循 CSPROJ 条件设置 msbuild 属性......所有这一切,同时 VS 打开一个 sln+csproj 文件结构,以便 VS 在评估 IDE 的 CSPROJ 时“看到”已经设置的属性(这使得在构建时运行的典型的基于 MSTask 的解决方案不可行!)..是一种方式吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)