使用工作目录的相对路径并在 C# 项目中启动

Use relative paths for working directory & start in C# project

在 C# 项目中,我尝试对 "Start external program" 和 "Working directory".

使用相对路径

我尝试了以 ../ 开头的相对路径和以 $(SolutionDir) / $(ProjectDir)

开头的相对路径

在所有尝试中,我都收到错误弹出窗口。 (找不到外部程序/你输入的工作目录不存在)-见截图

是否可以使用相对路径以及如何使用?我也在 msdn 上搜索过,但几乎没有关于 csproj.user 文件的信息。

我们需要这个,因为我们不喜欢为所有开发人员强制使用文件夹结构。

这存储在 csproj.user 文件 (myproject.csproj.user) 中,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <ProjectView>ProjectFiles</ProjectView>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
    <StartAction>Program</StartAction>
    <StartWorkingDirectory>%24%28SolutionDir%29\..\..\..\..\mydir</StartWorkingDirectory>
    <StartProgram>%24%28SolutionDir%29\..\..\dir\myapplication.exe</StartProgram>
  </PropertyGroup>
</Project>

我认为问题在于您展示的 window 中的 file/folder 控件没有翻译 $(SoultionDir) 宏。不知道如何解决这个问题,但是,您可以编辑 .csproj.user 文件,对 2 'offending' 行进行以下更改:

<StartWorkingDirectory>$(SolutionDir)..\..\..\..\mydir</StartWorkingDirectory>
<StartProgram>$(SolutionDir)..\..\dir\myapplication.exe</StartProgram>

另外,请注意 $(SolutionDir) 宏已经以 \ 结尾,因此您不需要紧跟在它后面!试试看!

你的动机可能有误:

We need this as we don't like to force a folder structure for all developers.

首先,如果您展示的所有这些都是可能的,那么您将完全做到这一点 - 迫使他们在他们的驱动器上创建该结构。此外,他们必须手动创建该结构,因为它位于解决方案文件夹之外,因此不受源代码控制。即,您不通过源代码控制交付 myprogram.exe(并不是说源代码控制是 .exe-s 的正确位置,但这是另一个问题)。最后,丑陋的事实是你需要一个文件夹结构来使用你需要的任何工具——它必须位于某个地方,对吧?所以我建议你停止与你的环境作斗争,而是让它为你工作。

指定一个与您的项目相关的文件夹,以包含您需要的工具。然后您可以使用相对路径到达该文件夹。通过这样做,您不强迫开发人员创建文件夹结构的动机也得到了满足,因为该文件夹可能会上传到源代码管理,因此只需获取最新版本即可下载它。更好的是,创建一个 NuGet 包并发布它。然后将该 NuGet 包安装到上述项目中,并保持 .exe-s

的源代码管理干净

直接在 .csproj 文件中编辑而不转义字符,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <ProjectView>ProjectFiles</ProjectView>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
    <StartAction>Program</StartAction>
    <StartWorkingDirectory>$(SolutionDir)..\..\..\..\mydir</StartWorkingDirectory>
    <StartProgram>$(SolutionDir)..\..\dir\myapplication.exe</StartProgram>
  </PropertyGroup>
</Project>

$(SolutionDir)

之后也不需要斜线

尽量使用没有条件的标签,比如

 <PropertyGroup>
    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>
  </PropertyGroup>

此外,考虑使用 $(MSBuildProjectDirectory) 变量,当通过 cli 传递参数时,该变量默认填充,例如dotnet run -p testmvc

我测试了所有的想法。不幸的是 none 的答案确实有效或有足够的细节,所以我添加了我自己的答案。

  • $(ProjectDir)、$(MSBuildProjectDirectory) 和 $(SolutionDir) 将不起作用。不在 csproj 中,也不在 csproj.user 中。也没有转义,引号等。当 运行:
  • 时,从错误弹出窗口中可以清楚地看到这一点

  • 相对路径确实有效,但是StartProgramStartWorkingDirectory有不同的初始目录!

  • StartProgram在解决方案文件(.sln)所在目录启动

  • StartWorkingDirectory在项目的bin目录下启动。

所以我现在为我工作:

  • 启动程序:..\mydir\myapplication.exe
  • 开始工作目录:..\..\..\..\..\mydir(与 myapplication.exe 相同的目录)

我知道这听起来可能和其他人一样,我只是想说明一下你确实是这样做的。

你应该

  1. 关闭 visual studio - 这很重要,因为如果您保持打开状态它可能会覆盖您的文件
  2. 使用记事本打开myproject.csproj.user
  3. 输入这个

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <ProjectView>ProjectFiles</ProjectView>
      </PropertyGroup>
      <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
        <StartAction>Program</StartAction>
        <StartWorkingDirectory>$(SolutionDir)..\..\..\..\mydir</StartWorkingDirectory>
        <StartProgram>$(SolutionDir)..\..\dir\myapplication.exe</StartProgram>
      </PropertyGroup>
    </Project>
    
  4. 关闭记事本

  5. 打开Visual Studio
  6. 转到项目属性并确认您看到了这个