我正在尝试为C#项目编写一个post-build事件。我使用自定义控制台应用(myTool.exe
)来做到这一点。
例如,构建后事件是
" $(SolutionDir)工具\ myTool.exe" " $(SolutionDir)myProject的\ BIN \"调试
(引用所有路径,因为它们可能包含空格。)
在转义之前,$(SolutionDir)
为D:\Some\MySystem\
。
转义后,它应该变为D:\\Some\\MySystem\\
。
如何在csproj文件中以这种方式转义\
中的所有$(SolutionDir)
?
我尝试使用this approach,但它似乎不适用于$(SolutionDir)
:
<PropertyGroup>
<EscapedSolutionDir>$(SolutionDir.Replace('\\', '\\\\'))</EscapedSolutionDir>
<EscapedTargetDir>$(TargetDir.Replace('\\', '\\\\'))</EscapedTargetDir>
</PropertyGroup>
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command=""$(EscapedSolutionDir)source\\Native\\Output\\NativeLibraryCopier.exe" "$(EscapedSolutionDir)" "$(ConfigurationName)" "$(PlatformName)" "$(TargetDir)"" />
</Target>
PS:请参阅this了解为什么我必须替换反斜杠。
答案 0 :(得分:2)
如何在VS项目文件中转义$(SolutionDir)中的反斜杠?
不确定为什么要更换&#34; \&#34;用&#34; \\&#34;在$(SolutionDir)中。这是因为此属性为common macros for build commands and properties,您可以在项目的“属性页”对话框中的任何位置使用这些宏,其中接受字符串。
但如果您坚持要替换它,则应将其替换为$(SolutionDir.Replace('\', '\\'))
而不是$(SolutionDir.Replace('\\', '\\\\'))
。由于$(SolutionDir)
中的路径为D:\Some\MySystem\
,只有一个反斜杠。当您使用双反斜杠替换它时,MSBuild无法在$(SolutionDir)
中找到双反斜杠。
所以脚本应该是:
<PropertyGroup>
<EscapedSolutionDir>$(SolutionDir.Replace('\', '\\'))</EscapedSolutionDir>
<EscapedTargetDir>$(TargetDir.Replace('\', '\\'))</EscapedTargetDir>
</PropertyGroup>
然后我使用目标来输出EscapedSolutionDir
和EscapedTargetDir
中的转义值,这两个值都被转义:
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Message Text="$(EscapedSolutionDir)" Importance="high">
</Message>
<Message Text="$(EscapedTargetDir)" Importance="high">
</Message>
</Target>
输出: