我正在尝试将此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] ...'" />
我有点犹豫要开始一个全新的过程,只是为了创造相对路径,所以这是一个破坏者。
答案 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
和构造函数(不仅仅是静态函数)。