微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CSPROJ 检测 Roslyn 次要版本或 VS IDE 次要版本的条件

如何解决CSPROJ 检测 Roslyn 次要版本或 VS IDE 次要版本的条件

由于 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 结构中找到此信息

  1. 是否有任何 MSBuild/VisualStudio/ENV/etc $() 样式的变量包含有关 VS IDE 或 CSC/Roslyn 编译器的次要版本号的信息?

  2. 如果没有,那么也许有一种方法可以启动 csc.exe,抓住它的标签行,并为遵循 CSPROJ 条件设置 msbuild 属性......所有这一切,同时 VS 打开一个 sln+csproj 文件结构,以便 VS 在评估 IDE 的 CSPROJ 时“看到”已经设置的属性(这使得在构建时运行的典型的基于 MSTask 的解决方案不可行!)..是一种方式吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。