我将如何从 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>

如您所见,我已经注释掉了FirstUriSecondUri片段,因为我无法弄清楚如何让它们工作。我试过new Uri($(FirstString)),但这只是导致它被替换为 s1 的文字值(例如 "new Uri(C:'Users)" )。

我如何让它工作?任何帮助将不胜感激,谢谢!


编辑:好吧,看起来直接 MSBuild 是不可能的。我已经接受了 Mark Arnott 关于创建自定义 MSBuild 任务的答案,尽管我认为我不会自己做这件事。

也许如果你在仅限Windows的客户端上运行,你可以做这样的事情:

<Exec Command="powershell '(New-Object [System.Uri] ...'" />

不过,我有点犹豫要不要开始一个全新的过程来创建相对路径,所以这有点破坏交易。

我将如何从 MSBuild 调用在 C# 中定义的构造函数

我不确定你的目标是什么,但如果你真的需要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和构造函数(不仅仅是静态函数)可用。