在构建时或运行时获取解决方案路径

时间:2016-02-27 03:05:41

标签: c# visual-studio configuration-files visual-studio-2015

我有一个C#解决方案,我希望在构建期间将解决方案的路径设置为app.config。例如。假设我打开了解决方案c:\temp\visual studio\super fun project\super_fun_project.sln。我构建并在其中一个测试项目中将应用程序设置更改为解决方案的完整路径。即

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="fullSolutionPath" value="{setAtBuild}"/>
  </appSettings>
</configuration>

如果我要去c:\temp\visual studio\super fun project\Foobar.Tests\bin\Debug\Foobar.Tests.dll.config,那将会是

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="fullSolutionPath" value="c:\temp\visual studio\super fun project\super_fun_project.sln"/>
  </appSettings>
</configuration>

或者它需要格式化,以便在运行时我要求的值我确实得到了正确的路径。我查看了转换,但我无法弄清楚如何设置解决方案路径。有没有其他技巧可以得到这个?

2 个答案:

答案 0 :(得分:3)

您可以做的是修改项目文件并添加MsBuild Target

目标可以使用Custom Inline Task,其源代码已集成到项目文件中。

所以要添加这个任务:

1)卸载项目(右键单击项目节点,选择&#34;卸载项目&#34;)

2)编辑项目文件(右键单击项目节点,选择&#34;编辑&#34;)

3)将以下内容添加到项目文件中(例如到最后)并重新加载,现在在构建时,配置文件将相应地进行修改。

<Project ...>
  ...
    <Target Name="AfterBuild">
      <RegexReplace FilePath="$(TargetDir)$(TargetFileName).config" Input="setAtBuild" Output="$(SolutionPath)" />
    </Target>
    <UsingTask TaskName="RegexReplace" TaskFactory="CodeTaskFactory" AssemblyName="Microsoft.Build.Tasks.Core" >
      <ParameterGroup>
        <FilePath Required="true" />
        <Input Required="true" />
        <Output Required="true" />
      </ParameterGroup>
      <Task>
        <Using Namespace="System.Text.RegularExpressions"/>
        <Code Type="Fragment" Language="cs"><![CDATA[
                File.WriteAllText(FilePath, Regex.Replace(File.ReadAllText(FilePath), Input, Output));
            ]]></Code>
      </Task>
    </UsingTask>
</Project>

在这里,我已将Output定义为使用名为SolutionPath的Visual Studio MSBuild Property,但您可以重复使用此RegexReplace任务并更新Input }和Output参数满足各种需求。

答案 1 :(得分:1)

我不知道你的用例是什么,但你可以调用一个自行开发的批处理文件来从项目的后期构建事件中执行此操作。

示例:在项目中创建名为&#39; updateconf.bat&#39; 的批处理脚本,确保它是ANSII编码的(可能使用notepad ++编写)脚本并确认ansii)或者当你编译VS项目并检查输出时,你会得到一个异常,表明该文件的前缀是非法字符。

批处理脚本的内容:

@echo off > newfile & setLocal ENABLEDELAYEDEXPANSION
set old="{setAtBuild}"
set new=%2
set targetBinary=%3


cd %1
for /f "tokens=* delims= " %%a in (%targetBinary%.config) do (
set str=%%a
set str=!str:%old%=%new%!
>> newfile echo !str!
)

del /F /Q %targetBinary%.config
rename "newfile" "%targetBinary%.config"

然后在调用批处理脚本的项目属性中添加一个构建后事件:

call $(ProjectDir)\updateconf.bat "$(TargetDir)" "$(SolutionPath)" $(TargetFileName)