我将如何从 MSBuild 调用在 C# 中定义的构造函数
本文关键字:定义 构造函数 调用 MSBuild | 更新日期: 2023-09-27 18:35:18
我正在尝试将此 C# 代码转换为在 MSBuild 中运行:
var uri = new Uri(s1);
var result = uri.MakeRelativeUri(new Uri(s2)).ToString();
不过,我不太确定您将如何从 MSBuild 调用 Uri
构造函数。这是我到目前为止所拥有的:
<PropertyGroup>
<!-- <FirstUri>???</FirstUri>
<SecondUri>???</SecondUri> -->
<RelativeUri>$(FirstUri.MakeRelativeUri($(SecondUri)))</RelativeUri>
<AsString>$(RelativeUri.ToString())</RelativeUri>
</PropertyGroup>
如您所见,我已经注释掉了FirstUri
和SecondUri
片段,因为我无法弄清楚如何让它们工作。我试过new Uri($(FirstString))
,但这只是导致它被替换为 s1 的文字值(例如 "new Uri(C:'Users)"
)。
我如何让它工作?任何帮助将不胜感激,谢谢!
编辑:好吧,看起来直接 MSBuild 是不可能的。我已经接受了 Mark Arnott 关于创建自定义 MSBuild 任务的答案,尽管我认为我不会自己做这件事。
也许如果你在仅限Windows的客户端上运行,你可以做这样的事情:
<Exec Command="powershell '(New-Object [System.Uri] ...'" />
不过,我有点犹豫要不要开始一个全新的过程来创建相对路径,所以这有点破坏交易。
我不确定你的目标是什么,但如果你真的需要MSBuild来运行一些C#代码,你需要使用内联任务。请参阅 MSDN 的演练:创建内联任务
大多数情况下,MSBuild 运行预编译的任务和命令行实用工具。
通常你会这样做:
<PropertyGroup>
<FirstUri>$([System.Uri]::new($(FirstString)))</FirstUri>
<SecondUri>$([System.Uri]::new($(SecondString)))</SecondUri>
<RelativeUri>$(FirstUri.MakeRelativeUri($(SecondUri)))</RelativeUri>
<AsString>$(RelativeUri.ToString())</AsString>
</PropertyGroup>
但是,System.Uri
不是 MSBuild 中的可用类型。MSBuild 属性参考包含可用类型的列表,但我发现它并不包含所有内容。我发现其他类型,如System.Version
和构造函数(不仅仅是静态函数)可用。