在任何一种编程语言中,做基本的数学运算都是非常容易的事情。不过,不知道 .NET 项目的项目文件 csproj 文件中进行数学运算就不像一般的编程语言那样直观了,毕竟这不是一门语言,而只是一种项目文件格式而已。
本文介绍如何在 Roslyn/MSBuild 的项目文件中使用基本的数学运算。
Roslyn/MSBuild 中的数学运算
在 MSBuild 中,数学运算需要使用 MSBuild
内建的方法调用来实现。
你只需要给 MSBuild 中那些数学计算方法中传入看起来像是数字的属性,就可以真的计算出数字出来。
加减乘除模
Add
两个数相加,实现 a bSubtract
第一个数减去第二个数,实现 a - bMultiply
两个数相乘,实现 a * bDivide
第一个数除以第二个数,实现 a / bModulo
第一个数与第二个数取模,实现 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]) 。