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

How would I call a constructor defined in C# from MSBuild?

我正在尝试将此 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# 代码,则需要使用内联任务。 参见 MSDN's Walkthrough: Creating an Inline Task

大部分时间 MSBuild 运行s 预编译任务和命令行实用程序。

通常你会这样做:

<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 Property Reference 包含可用类型的列表,但我发现它并不包含所有类型。我发现其他类型如 System.Version 和构造函数(不仅仅是静态函数)可用。