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

时间:2016-02-18 04:42:02

标签: c# .net 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] ...'" />

我有点犹豫要开始一个全新的过程,只是为了创造相对路径,所以这是一个破坏者。

2 个答案:

答案 0 :(得分:1)

我不确定你的目标是什么,但如果你真的需要MSBuild来运行一些C#代码,你需要使用内联任务。 见MSDN's Walkthrough: Creating an Inline Task

大多数情况下,MSBuild运行预编译的任务和命令行实用程序。

答案 1 :(得分:0)

通常你会这样做:

<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和构造函数(不仅仅是静态函数)。