Visual Studio 在C#项目中使用工作目录的相对路径& start

68de4m5k  于 2023-05-29  发布在  C#
关注(0)|答案(7)|浏览(588)

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

cgfeq70w1#

你可能有错误的动机:
我们需要这个,因为我们不喜欢强制所有开发人员的文件夹结构。
首先,如果你所展示的一切都是可能的,你会这样做-强迫他们在他们的驱动器上创建那个结构。此外,他们必须手动创建该结构,因为它位于解决方案文件夹之外,因此不受源代码控制。也就是说,你没有通过源代码控制来交付myprogram.exe(并不是说源代码控制是.exe-s的正确位置,但这是另一个问题)。最后,丑陋的事实是,你需要一种文件夹结构来使用你需要的任何工具-它必须位于某个地方,对吗?所以我建议你停止与你的环境作斗争,而是让它为你工作。
指定一个相对于项目的文件夹,以包含所需的工具。然后,您可以使用相对路径到达该文件夹。通过这样做,您不强迫开发人员创建文件夹结构的动机也得到了满足,因为该文件夹可能会上传到源代码控制,因此只需获取最新版本即可下载它。更好的是,创建一个NuGet包并发布它。然后将NuGet包安装到上述项目中,并保持源代码控制中没有.exe-s

qkf9rpyu

qkf9rpyu2#

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

ulydmbyx

ulydmbyx3#

我知道这听起来和其他人一样,我只是想弄清楚你确实做到了这一点。
你应该
1.关闭visual studio-这很重要,因为如果您一直打开文件,它可能会覆盖您的文件
1.使用记事本打开myproject.csproj.user
1.输入此

<?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>

1.关闭记事本
1.打开Visual Studio
1.转到项目属性并确认您看到此x1c 0d1x

xzabzqsa

xzabzqsa4#

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

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

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

wlzqhblo

wlzqhblo5#

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

  • $(ProjectDir)、$(MSBuildProjectDirectory)和$(SolutionDir)不起作用。不在csproj和csproj. user中。也不转义、引号等。这在运行时的错误弹出窗口中是清楚的:

  • 相对路径 * 可以 * 工作,但是 StartProgramStartWorkingDirectory 具有不同的初始目录!
  • StartProgram 在解决方案文件(.sln)所在的目录中启动
  • StartWorkingDirectory 在项目的bin目录中启动。

所以我现在为我工作:

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

pn9klfpd6#

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

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

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

d4so4syb

d4so4syb7#

.net6 /.net7
在csproj中,只需在TargetFramework下面添加

<StartWorkingDirectory>$(MSBuildProjectDirectory)</StartWorkingDirectory>

相关问题