【问题标题】:Use relative paths for working directory & start in C# project使用工作目录的相对路径并在 C# 项目中启动
【发布时间】:2019-08-14 08:40:09
【问题描述】:

在 C# 项目中,我尝试对“启动外部程序”和“工作目录”使用相对路径。

我尝试了以../ 开头的相对路径和以$(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>

【问题讨论】:

  • 它应该可以工作,但是 1) 您必须取消转义 StartProgram 值,使其在 Xml 中显示。 2)一旦你完成了,确保 $(SolutionDir) 真的是你认为的那样(它不是项目目录)。为确保这一点,您可以使用 sysinternals 中的 ProcMon 等工具,对 devenv.exe 进行过滤,您应该会看到它在哪里寻找确切的位置。
  • 请解释反对意见/如何改进这个问题
  • 我给了你一个赞成票 - 你尝试我的答案了吗?
  • 还没有。本周将尝试:)

标签: c# visual-studio visual-studio-2017 csproj csproj-user


【解决方案1】:

直接在.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) 之后也不需要斜杠

【讨论】:

  • 我对此进行了测试。不幸的是它不起作用。你自己测试过吗?
  • 是的,我试过了,按预期工作。当我转到项目的属性(在 Visual Studio 中)时,我看到路径已完全解析。
  • 我添加了截图
【解决方案2】:

我知道这听起来可能和其他人一样,我只是想清楚你确实做到了这一点。

你应该

  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. 转到项目属性并确认您看到了

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    【解决方案4】:

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

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

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

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

    • StartWorkingDirectory 从项目的 bin 目录开始。

    所以我现在为我工作:

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

    【讨论】:

      【解决方案5】:

      我认为问题在于您显示的 congif 窗口中的文件/文件夹控件没有翻译 $(SoultionDir) 宏。不知道如何解决这个问题,但您可以编辑 .csproj.user 文件,对 2 条“违规”行进行以下更改:

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

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

      【讨论】:

      • 我对此进行了测试。不幸的是它不起作用。你自己测试过吗?
      • 我删除了错误的"' 字符!我在我的项目中使用非常相似的相对路径,但使用$(ProjectDir) 而不是$(SolutionDir),它们工作得很好。
      • 您确定您的$(SolutionDir) 至少有4 个层次结构吗?如果不是,它失败!
      【解决方案6】:

      你可能有错误的动机:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-01
        • 2017-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多