取消

在 Roslyn/MSBuild 中进行基本的数学运算

在任何一种编程语言中,做基本的数学运算都是非常容易的事情。不过,不知道 .NET 项目的项目文件 csproj 文件中进行数学运算就不像一般的编程语言那样直观了,毕竟这不是一门语言,而只是一种项目文件格式而已。

本文介绍如何在 Roslyn/MSBuild 的项目文件中使用基本的数学运算。


Roslyn/MSBuild 中的数学运算

在 MSBuild 中,数学运算需要使用 MSBuild 内建的方法调用来实现。

你只需要给 MSBuild 中那些数学计算方法中传入看起来像是数字的属性,就可以真的计算出数字出来。

加减乘除模

  • Add 两个数相加,实现 a + b
  • Subtract 第一个数减去第二个数,实现 a - b
  • Multiply 两个数相乘,实现 a * b
  • Divide 第一个数除以第二个数,实现 a / b
  • Modulo 第一个数与第二个数取模,实现 a % b

而具体到 MSBuild 中的使用,则是这样的:

1
2
<!-- 计算 5 - 1 的数学运算结果 -->
<Walterlv>$([MSBuild]::Subtract(5, 1))</Walterlv>
1
2
3
<!-- 取出 Walterlv 属性的字符串值,然后计算其长度减去 1,将数学运算结果存入 Walterlv2 属性中 -->
<Walterlv>walterlv is a 逗比</Walterlv>
<Walterlv2>$([MSBuild]::Subtract($(Walterlv.Length), 1))</Walterlv2>

不要试图在 MSBuild 中使用传统的数学运算符号

不同于一般编程语言可以写的 + - * /,如果你直接在项目文件中使用这样的符号来进行数学计算,要么你将得到一个数学运算的字符串,要么你将得到编译错误。

例如,如果你在你的项目文件中写了下面这样的代码,那么无一例外全部不能得到正确的数学运算结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>

    <!-- 这个属性将得到一个 “1 + 1” 字符串 -->
    <Walterlv>1 + 1</Walterlv>

    <!-- 无法编译此属性 -->
    <!-- 无法计算表达式“"1 + 1".Length + 1”。未找到方法“System.String.Length + 1” -->
    <Walterlv2>$(Walterlv.Length + 1)</Walterlv2>

    <!-- 这个属性将得到一个 “5 + 1” 字符串 -->
    <Walterlv3>$(Walterlv.Length) + 1</Walterlv3>

  </PropertyGroup>

</Project>

参考资料

本文会经常更新,请阅读原文: https://blog.walterlv.com/post/msbuild-numeric-methods.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected])

登录 GitHub 账号进行评论