我如何从 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>
如您所见,我注释掉了 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'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
和构造函数(不仅仅是静态函数)可用。
我正在尝试将此 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'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
和构造函数(不仅仅是静态函数)可用。