使用工作目录的相对路径并在 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 中。也没有转义,引号等。当 运行:
时,从错误弹出窗口中可以清楚地看到这一点
相对路径确实有效,但是StartProgram和StartWorkingDirectory有不同的初始目录!
StartProgram在解决方案文件(.sln)所在目录启动
- StartWorkingDirectory在项目的bin目录下启动。
所以我现在为我工作:
- 启动程序:
..\mydir\myapplication.exe
- 开始工作目录:
..\..\..\..\..\mydir
(与 myapplication.exe
相同的目录)
我知道这听起来可能和其他人一样,我只是想说明一下你确实是这样做的。
你应该
- 关闭 visual studio - 这很重要,因为如果您保持打开状态它可能会覆盖您的文件
- 使用记事本打开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>$(SolutionDir)..\..\..\..\mydir</StartWorkingDirectory>
<StartProgram>$(SolutionDir)..\..\dir\myapplication.exe</StartProgram>
</PropertyGroup>
</Project>
关闭记事本
- 打开Visual Studio
- 转到项目属性并确认您看到了这个
在 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 中。也没有转义,引号等。当 运行: 时,从错误弹出窗口中可以清楚地看到这一点
相对路径确实有效,但是StartProgram和StartWorkingDirectory有不同的初始目录!
StartProgram在解决方案文件(.sln)所在目录启动
- StartWorkingDirectory在项目的bin目录下启动。
所以我现在为我工作:
- 启动程序:
..\mydir\myapplication.exe
- 开始工作目录:
..\..\..\..\..\mydir
(与myapplication.exe
相同的目录)
我知道这听起来可能和其他人一样,我只是想说明一下你确实是这样做的。
你应该
- 关闭 visual studio - 这很重要,因为如果您保持打开状态它可能会覆盖您的文件
- 使用记事本打开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>$(SolutionDir)..\..\..\..\mydir</StartWorkingDirectory> <StartProgram>$(SolutionDir)..\..\dir\myapplication.exe</StartProgram> </PropertyGroup> </Project>
关闭记事本
- 打开Visual Studio
- 转到项目属性并确认您看到了这个