8

在 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>
4

6 回答 6

9

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

在此处输入图像描述

于 2019-08-21T11:38:25.287 回答
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. 转到项目属性并确认您看到了这个 在此处输入图像描述
于 2019-08-23T15:51:49.150 回答
1

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

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

在此处输入图像描述

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

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

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

所以我现在为我工作:

  • 启动程序:..\mydir\myapplication.exe
  • 开始工作目录:(..\..\..\..\..\mydir与 相同的目录myapplication.exe
于 2019-08-23T14:16:01.547 回答
1

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

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

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

于 2019-08-17T19:43:56.433 回答
1

尝试无条件使用标签,例如

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

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

于 2019-08-22T04:24:57.537 回答
-1

你可能有错误的动机:

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

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

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

于 2019-08-20T15:14:37.617 回答