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

时间:2011-01-23 16:00:08

标签: visual-studio-2010

我看过一些与此主题相关的帖子,但没有任何结论性答案......

在调试我的VS.NET 2010应用程序时,我正在尝试启动一个位置相对于项目路径的外部程序。我已经看到一些迹象表明在早期版本的VS.NET中支持宏(如$(ProjectDir)),但它们似乎在VS.NET 2010中不起作用。使用相对路径表示法只是给出了一个错误,即路径无效。

有没有人碰到这个?如果是这样,你是怎么解决的?

感谢。

7 个答案:

答案 0 :(得分:46)

我知道派对有点晚了,但这就是我们这样做的方式。关键是将'OutputPath'显式设置为Build目录。这会将其重新定位到工作目录而不是VS安装目录。

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

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

  3. 以下是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

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

  1. 宏在这里不起作用,所以不要忘了。
  2. 环境变量也不起作用,所以也要忘记它。
  3. 事实证明,Visual Studio.NET(至少2008年和2010年)使用两个路径之一作为启动外部程序设置中指定的任何相对路径的基础......
  4. 如果通过在资源管理器中单击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)

如果您在启动外部程序中直接在VS2010中使用它,

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

enter image description here

也可以使用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)解决方案的目录(定义为驱动器+路径);包括尾部反斜杠'\'。