Использование относительного пути для «Запускать внешнюю программу» в VS.NET 2010 - PullRequest
38 голосов
/ 23 января 2011

Я видел несколько постов, связанных с этой темой, но ни одного с какими-либо убедительными ответами ...

При отладке моего приложения VS.NET 2010 я пытаюсь запустить внешнюю программу, расположение которойотносительно пути проекта.Я видел некоторые признаки того, что макросы (например, $ (ProjectDir)) были поддержаны в более ранних версиях VS.NET, но они не работают в VS.NET 2010. Использование нотации относительного пути просто дает мне ошибку, чтопуть неверен.

Кто-нибудь сталкивался с этим?Если да, то как вы обратились?

Спасибо.

Ответы [ 7 ]

46 голосов
/ 10 марта 2011

Я знаю, что это немного поздно для вечеринки, но вот как мы это делаем.Ключом к этому является явная установка OutputPath в каталог Build.Это переопределяет его в рабочий каталог, а не в каталог установки VS.

  1. Обновите путь вывода для проекта следующим образом:
    <OutputPath>$(MSBuildProjectDirectory)\bin\</OutputPath>

  2. Обновление 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>
30 голосов
/ 05 сентября 2011

Подобно тому, что предложил Yobi21, редактирование файла проекта и добавление этих строк в основной файл <PropertyGroup> в файле проекта работает для меня:

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

Следите за свойствами в.csproj.user файл переопределяет те, что есть в вашем обычном файле проекта.

Этот файл ставил меня в тупик, пока я не удалил записи.

17 голосов
/ 23 января 2011

Нашел ответ здесь .

В случае, если вышеуказанная ссылка не работает, краткий ответ будет следующим:

  1. Макросы здесь не работают, так что забудьте об этом.
  2. Переменные окружения тоже не работают, поэтому забудьте об этом.
  3. Оказывается, что Visual Studio.NET (по крайней мере, 2008 и 2010) использует один из двух путей в качестве основы для любого относительного пути, указанного в параметре Запустить внешнюю программу ...

Если Visual Studio.NET был запущен нажатием на файл SLN в Проводнике, базовым путем будет папка (включая «\»), в которой находится SLN. После того, как я изменил свой относительный путь к этой учетной записи, а затем запустил VS.NET 2010, дважды щелкнув файл SLN, моя внешняя программа правильно запустилась при нажатии F5.

Если Visual Studio.NET был запущен из ярлыка в меню «Пуск», а затем SLN был открыт из Visual Studio.NET, базовый путь будет [Путь установки Visual Studio] \ Microsoft Visual Studio [" 9,0 "или" 10,0 "в зависимости от того, используете ли VS.NET 2008 или 2010] \ Common7 \ IDE \ .

Полагаю, сейчас это имеет смысл, но все равно воняет, что VS.NET будет правильно находить мою внешнюю программу только в зависимости от того, как я запускаю VS.NET.

14 голосов
/ 31 марта 2012

$ (SolutionDir) не будет работать, если вы используете его непосредственно в VS2010 в стартовой внешней программе, но если вы закроете свое решение и откроете 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>
0 голосов
/ 06 февраля 2019

Нечто, на что я наткнулся, которое, кажется, не мешает и не переопределяет существующие макросы: Похоже, вы можете определить свои собственные макросы и использовать их

<StartAction>Program</StartAction>
<MyMacro>$(MSBuildProjectDirectory)your_folder_path_here\</MyMacro>
<StartProgram>$(MyMacro)MyApp.exe</StartProgram>
0 голосов
/ 29 июня 2016

Вы можете изменить .user в блокноте, когда решение закрыто , чтобы даже включать относительные пути.Это, однако, ужасно.Пример:

<StartProgram>$([System.IO.Path]::GetDirectoryName($([System.IO.Path]::GetDirectoryName($(SolutionDir))))\MyCustomBindir\MyCustomProgram.exe</StartProgram>

Это без прокрутки

<StartProgram><br>$([System.IO.Path]::GetDirectoryName($([System.IO.Path]::GetDirectoryName( $(SolutionDir))<br>))\MyCustomBindir\MyCustomProgram.exe<br></StartProgram>

enter image description here

Можно также использовать предопределенные папки Windows.

<StartProgram>$(AppData)\MyCustomBindir\MyCustomProgram.exe</StartProgram>

Помните, что xml conifg .user анализируется при загрузке решения, а не при нажатии кнопки отладки Start , поэтому любые изменения в файле .user должны произрешение закрыто.

0 голосов
/ 23 января 2011

Список доступных макросов для vs2010 приведен на этом веб-сайте MSDN

Макросы ProjectDir перечислены как доступные для VS2010

$ (ProjectDir) Каталог проекта (определяется как диск + путь); включает обратную косую черту '\'.

Но если у вас возникают проблемы с ним, вы можете попробовать использовать SolutionDir.

$ (SolutionDir) Каталог решения (определяется как диск + путь); включает обратную косую черту '\'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...