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

2023-10-22 10:04:11 浏览数 (2)

在任何一种编程语言中,做基本的数学运算都是非常容易的事情。不过,不知道 .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>


参考资料

  • Property Functions - Visual Studio 2015 - Microsoft Docs

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

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

0 人点赞