如何在VS项目文件中的$(SolutionDir)中转义反斜杠?

时间:2018-01-30 05:17:29

标签: c# msbuild visual-studio-2017

我正在尝试为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="&quot;$(EscapedSolutionDir)source\\Native\\Output\\NativeLibraryCopier.exe&quot; &quot;$(EscapedSolutionDir)&quot; &quot;$(ConfigurationName)&quot; &quot;$(PlatformName)&quot; &quot;$(TargetDir)&quot;" />
</Target>

PS:请参阅this了解为什么我必须替换反斜杠。

1 个答案:

答案 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>

然后我使用目标来输出EscapedSolutionDirEscapedTargetDir中的转义值,这两个值都被转义:

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Message Text="$(EscapedSolutionDir)" Importance="high">
    </Message>
    <Message Text="$(EscapedTargetDir)" Importance="high">
    </Message>
  </Target>

输出:

enter image description here