在VS.NET 2010中使用“启动外部程序”的相对path
我已经看到了与这个主题相关的几个职位,但没有任何确凿的答案…
当debugging我的VS.NET 2010应用程序,我试图启动一个外部程序,其位置是相对于项目path。 我已经看到一些迹象表明,在早期版本的VS.NET中支持macros(像$(ProjectDir)),但在VS.NET 2010中似乎不起作用。使用相对path表示法只会给我一个错误,path无效。
有没有人遇到过这个? 如果是这样,你是如何解决的?
谢谢。
我知道这对派对来说有点晚,但是这就是我们如何去做的。 关键是将“OutputPath”显式设置为Build目录。 这重新将其基于工作目录,而不是VS安装目录。
-
更新项目的输出path为:
<OutputPath>$(MSBuildProjectDirectory)\bin\</OutputPath>
-
更新项目的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答案。
如果上述链接失效,总结的答案如下:
- macros在这里不起作用,所以忘了这一点。
- 环境variables也不起作用,所以不要这样做。
- 事实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); 包括尾部的反斜杠'\'。