我看过一些与此主题相关的帖子,但没有任何结论性答案......
在调试我的VS.NET 2010应用程序时,我正在尝试启动一个位置相对于项目路径的外部程序。我已经看到一些迹象表明在早期版本的VS.NET中支持宏(如$(ProjectDir)),但它们似乎在VS.NET 2010中不起作用。使用相对路径表示法只是给出了一个错误,即路径无效。
有没有人碰到这个?如果是这样,你是怎么解决的?
感谢。
答案 0 :(得分:46)
我知道派对有点晚了,但这就是我们这样做的方式。关键是将'OutputPath'显式设置为Build目录。这会将其重新定位到工作目录而不是VS安装目录。
更新项目的输出路径:
<OutputPath>$(MSBuildProjectDirectory)\bin\</OutputPath>
将项目的StartProgram更新为:
<StartProgram>$(OutputPath)Relative.exe</StartProgram>
以下是PropertyGroup的示例配置:
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == '0-Local|AnyCPU'">
<!-- default values you should already have in your csproj -->
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<!-- actual output path and start action definition -->
<OutputPath>$(MSBuildProjectDirectory)\bin\</OutputPath>
<StartAction>Program</StartAction>
<StartProgram>$(OutputPath)NServiceBus.Host.exe</StartProgram>
<StartArguments>NServiceBus.Integration</StartArguments>
</PropertyGroup>
答案 1 :(得分:30)
与Yobi21建议的类似,编辑项目文件并将这些行添加到项目文件中的主<PropertyGroup>
对我有用:
<StartAction>Program</StartAction>
<StartProgram>$(MSBuildProjectDirectory)\Path\Relative\To\CSProj\Folder</StartProgram>
<StartArguments>Any Required Arguments</StartArguments>
注意
.csproj.user
文件中的属性,覆盖常规项目文件中的属性。
这个让我很难过,直到我删除了这些条目。
答案 2 :(得分:17)
找到答案here。
如果上述链接失效,总结的答案如下:
如果通过在资源管理器中单击SLN文件启动Visual Studio.NET,则基本路径将是SLN所在的文件夹(包括“\”)。一旦我修改了我的相对路径来考虑这个,然后通过双击SLN文件启动VS.NET 2010,我的外部程序在点击F5时正确启动。
如果从“开始”菜单上的快捷方式启动Visual Studio.NET,然后从Visual Studio.NET中打开SLN,则基本路径将为 [Visual Studio安装路径] \ Microsoft Visual Studio [“ 9.0“或”10.0“取决于是使用VS.NET 2008还是2010] \ Common7 \ IDE \ 。
我认为现在有道理,但它仍然有点臭,VS.NET只会根据我启动VS.NET的方式正确找到我的外部程序。
答案 3 :(得分:14)
$(SolutionDir)将无法工作,但如果您关闭解决方案并使用记事本打开YourProject.csproj.user,则可以更改路径并包含$( SolutionDir)。
重新打开VS 2010,它就像一个魅力。
这是我的项目“ApplicationService_NSB.csproj.user”
的一个例子<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<StartAction>Program</StartAction>
<StartProgram>$(SolutionDir)\Super\ApplicationService_NSB\bin\Debug\NServiceBus.Host.exe</StartProgram>
</PropertyGroup>
</Project>
答案 4 :(得分:0)
您可以在解决方案关闭时更改记事本中的.user ,甚至可以包含相对路径。然而,这是可怕的。 例如:
<StartProgram>$([System.IO.Path]::GetDirectoryName($([System.IO.Path]::GetDirectoryName($(SolutionDir))))\MyCustomBindir\MyCustomProgram.exe</StartProgram>
这是没有滚动
<StartProgram>
$([System.IO.Path]::GetDirectoryName($([System.IO.Path]::GetDirectoryName( $(SolutionDir))
))\MyCustomBindir\MyCustomProgram.exe
</StartProgram>
也可以使用Windows预定义文件夹。
<StartProgram>$(AppData)\MyCustomBindir\MyCustomProgram.exe</StartProgram>
记住xml conifg .user 文件在加载解决方案时解析而不是在按开始调试按钮时,因此在解决方案时必须对.user文件进行任何更改已关闭。
答案 5 :(得分:0)
我偶然发现的东西似乎并没有干扰或重新定义现有的宏: 看起来您可以定义自己的宏并使用它们
<StartAction>Program</StartAction>
<MyMacro>$(MSBuildProjectDirectory)your_folder_path_here\</MyMacro>
<StartProgram>$(MyMacro)MyApp.exe</StartProgram>
答案 6 :(得分:-6)
此网络MSDN
中列出了vs2010的可用宏列表ProjectDir宏列为可用于VS2010
$(ProjectDir)项目目录(定义为驱动器+路径);包括尾部反斜杠'\'。
但如果您遇到麻烦,可以尝试使用SolutionDir。
$(SolutionDir)解决方案的目录(定义为驱动器+路径);包括尾部反斜杠'\'。