在VS.NET 2010中使用“启动外部程序”的相对path

我已经看到了与这个主题相关的几个职位,但没有任何确凿的答案…

当debugging我的VS.NET 2010应用程序,我试图启动一个外部程序,其位置是相对于项目path。 我已经看到一些迹象表明,在早期版本的VS.NET中支持macros(像$(ProjectDir)),但在VS.NET 2010中似乎不起作用。使用相对path表示法只会给我一个错误,path无效。

有没有人遇到过这个? 如果是这样,你是如何解决的?

谢谢。

我知道这对派对来说有点晚,但是这就是我们如何去做的。 关键是将“OutputPath”显式设置为Build目录。 这重新将其基于工作目录,而不是VS安装目录。

  1. 更新项目的输出path为:
    <OutputPath>$(MSBuildProjectDirectory)\bin\</OutputPath>

  2. 更新项目的StartProgram为:
    <StartProgram>$(OutputPath)Relative.exe</StartProgram>

这里是一个示例configurationPropertyGroup:

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

类似于Yobi21的build议,编辑项目文件并将这些行添加到项目文件中的主要<PropertyGroup>对我有效:

 <StartAction>Program</StartAction> <StartProgram>$(MSBuildProjectDirectory)\Path\Relative\To\CSProj\Folder</StartProgram> <StartArguments>Any Required Arguments</StartArguments> 

注意.csproj.user文件中的属性覆盖常规项目文件中的属性。

这一个难倒我直到我删除条目。

这里find答案。

如果上述链接失效,总结的答案如下:

  1. macros在这里不起作用,所以忘了这一点。
  2. 环境variables也不起作用,所以不要这样做。
  3. 事实certificate,Visual Studio.NET(至less2008年和2010年)使用两个path之一作为开始外部程序设置中指定的任何相对path的基础…

如果通过单击资源pipe理器中的SLN文件启动Visual Studio.NET,则基本path将是SLN所在的文件夹(包括“\”)。 一旦我修改我的相对path来解决这个问题,然后通过双击SLN文件启动VS.NET 2010,我的外部程序正确启动时,击中F5。

如果从“开始”菜单中的快捷方式启动Visual Studio.NET,然后从Visual Studio.NET中打开SLN,则基本path将为[Visual Studio安装path] \ Microsoft Visual Studio [“9.0”或“10.0”取决于是否使用VS.NET 2008或2010] \ Common7 \ IDE \

我想现在是有道理的,但它仍然有点臭VS.NET将只能find我的外部程序正确取决于我如何启动VS.NET。

如果您在启动外部程序中直接在VS2010中使用$(SolutionDir),则无法工作,但如果closures解决scheme并使用记事本打开YourProject.csproj.user,则可以更改path并包含$(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> 

您可以在解决schemeclosures时更改记事本中的.user,甚至包含相对path。 然而,这是可怕的。 例:

  <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中> $(应用程序数据)\ MyCustomBindir \ MyCustomProgram.exe </ StartProgram中> 

记住,在加载解决scheme时,不是在按下“ 开始”debuggingbutton时parsingxml conifg .user文件,因此在closures解决scheme时必须对.user文件进行任何更改。

本网站MSDN列出了vs2010的可用macros列表

ProjectDirmacros被列为可用于VS2010

$(ProjectDir)项目的目录(定义为drive + path); 包括尾部的反斜杠'\'。

但是如果你有这个问题,你可以尝试使用SolutionDir。

$(SolutionDir)解决scheme的目录(定义为drive + path); 包括尾部的反斜杠'\'。