43 votes

Utilisation d'un chemin relatif pour "Démarrer un programme externe" dans VS.NET 2010

J'ai vu quelques messages liés à ce sujet mais aucun avec des réponses concluantes...

Lors du débogage de mon application VS.NET 2010, j'essaie de lancer un programme externe dont l'emplacement est relatif au chemin du projet. J'ai vu certaines indications selon lesquelles les macros (comme $(ProjectDir)) étaient prises en charge dans les versions antérieures de VS.NET, mais elles ne semblent pas fonctionner dans VS.NET 2010. L'utilisation de la notation de chemin relatif me donne simplement une erreur indiquant que le chemin n'est pas valide.

Quelqu'un a-t-il rencontré ce problème ? Si oui, comment l'avez-vous résolu ?

Merci.

0 votes

Les macros peuvent toujours être utilisées, mais elles doivent être définies manuellement dans l'interface de l'utilisateur. .csproj Fichier XML. Après avoir effectué cette opération, n'oubliez pas de supprimer les sections concernées du fichier .csproj.user le cas échéant.

46voto

Yobi21 Points 967

Je sais que c'est un peu tard pour le faire, mais voici comment nous procédons. La clé est de définir explicitement le 'OutputPath' sur le répertoire de construction. Cela le re-base sur le répertoire de travail et non sur le répertoire d'installation de VS.

  1. Mettre à jour le chemin de sortie pour le projet à être :
    <OutputPath>$(MSBuildProjectDirectory)\bin\</OutputPath>

  2. Mettre à jour StartProgram pour le projet à être :
    <StartProgram>$(OutputPath)Relative.exe</StartProgram>

Voici un exemple de configuration 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>

0 votes

J'ai eu du mal à faire fonctionner votre suggestion. Pourriez-vous modifier votre message pour inclure un copier-coller de votre fichier .csproj ?

0 votes

+1, Génial. Je me suis longtemps battu contre cela, maintenant nous n'avons plus besoin de nous battre avec les paramètres du projet entre les machines de développement.

4 votes

NOTE : J'ai modifié un peu ceci et mis ceux-ci dans le <PropertyGroup> principal (celui sans l'attribut condition) et changé OutputPath en "$(MSBuildProjectDirectory) \bin\ $(Configuration)\" (sans les guillemets).

31voto

Patrick Earl Points 201

De la même façon que ce que Yobi21 a suggéré, en éditant le fichier du projet et en ajoutant ces lignes à la ligne principale <PropertyGroup> dans le fichier du projet a fonctionné pour moi :

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

Faites attention aux propriétés dans le .csproj.user qui remplacent ceux de votre fichier de projet ordinaire. Remarque : à partir de Visual Studio 2017, ces propriétés sont contenues dans le fichier launchsettings.json fichier.

Celui-ci m'a laissé perplexe jusqu'à ce que je supprime les entrées.

0 votes

J'ai ajouté un +1 à la réponse originale, pour découvrir que cette solution est meilleure ! L'ajout de ces propriétés au PropertyGroup principal fonctionne même lorsque vous ouvrez la solution depuis Visual Studio.

0 votes

Génial. J'ai ajouté ces lignes deux fois (une fois dans le bloc debug, une fois dans le bloc release) au lieu de la section principale des propriétés. Ça marche bien aussi.

0 votes

Après avoir supprimé le .csproj.user vous ne pouvez plus ouvrir les propriétés du projet dans VS. Ce n'était pas un problème pour vous ?

19voto

goombaloon Points 941

J'ai trouvé la réponse ici .

Dans l'éventualité où le lien ci-dessus disparaîtrait, la réponse résumée est la suivante :

  1. Les macros ne fonctionnent pas ici, alors oubliez-les.
  2. Les variables d'environnement ne fonctionnent pas non plus, alors oubliez-les aussi.
  3. Il s'avère que Visual Studio.NET (au moins 2008 et 2010) utilise l'un des deux chemins comme base pour tout chemin relatif spécifié dans la balise Lancer le programme externe le réglage...

Si Visual Studio.NET a été lancé en cliquant sur le fichier SLN dans l'explorateur, le chemin de base sera le dossier (y compris le "\") où réside le SLN. Une fois que j'ai modifié mon chemin relatif pour tenir compte de cela et que j'ai ensuite lancé VS.NET 2010 en double-cliquant sur le fichier SLN, mon programme externe s'est correctement lancé en appuyant sur F5.

Si Visual Studio.NET a été lancé à partir du raccourci du menu Démarrer, puis que le SLN a été ouvert à partir de Visual Studio.NET, le chemin de base sera le suivant [Chemin d'installation de Visual Studio] \Microsoft Visual Studio ["9.0" ou "10.0" selon que vous utilisez VS.NET 2008 ou 2010]. \Common7\IDE\ .

Je suppose que cela a un sens maintenant, mais ça craint toujours que VS.NET ne trouve mon programme externe correctement qu'en fonction de la façon dont je lance VS.NET.

0 votes

Merci de poster un lien vers mon site. Vous êtes géniaux !

0 votes

Je sais que je poste un commentaire sur une réponse qui date de plus de deux ans, mais j'aimerais clarifier ce "comportement étrange". En fait, il n'est pas si étrange que cela. Si je comprends bien, le concept de "répertoire de travail" provient du système d'exploitation, et non de VS lui-même. En ce qui concerne le système d'exploitation, le répertoire de travail est le répertoire à partir duquel VS a été invoqué (répertoire Solution lorsqu'il est lancé à partir du .sln, répertoire VS lorsqu'il est lancé à partir du lien). Ce que mai Ce qui est étrange, c'est que VS ne change pas explicitement le répertoire de travail à chaque fois qu'une solution est chargée.

1 votes

@MetaFight Le comportement étrange est que VS permet d'utiliser des macros telles que $(TargetDir) partout sauf dans le Debug dans les propriétés du projet, bien qu'elle puisse être définie manuellement dans la section .csproj fichier.

15voto

Arthis Points 1483

Le $(SolutionDir) ne fonctionnera pas si vous l'utilisez directement dans VS2010 dans le programme externe de démarrage, mais si vous fermez votre solution et ouvrez le fichier YourProject.csproj.user avec le bloc-notes, vous pouvez changer le chemin et inclure le $(SolutionDir).

Rouvrez VS 2010 et cela fonctionne comme un charme.

Voici un exemple de mon projet "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>

1 votes

La définition d'un StartWorkingDirectory serait également utile, le mien ne voulait pas fonctionner sans cela. Quelque chose comme ceci : <StartWorkingDirectory>$(SolutionDir) \Super\ApplicationServi ce_NSB \bin\Debug </StartWorkingDirectory>

0 votes

Merci, c'était très utile. Je me suis tapé la tête sur ce problème pendant une heure ou plus. +1

0 votes

N'oubliez pas de relancer votre visual studio j'ai perdu 15 mins. parce que j'ai ignoré la déclaration "Reopen VS" fonctionne dans VS 2013. aussi

-6voto

Jonathan Points 6611

La liste des macros disponibles pour vs2010 se trouve sur ce site web. MSDN

La macro ProjectDir est listée comme disponible pour VS2010.

$(ProjectDir) Le répertoire du projet (défini comme le lecteur + le chemin) ; inclut la barre oblique inversée de fin de ligne '\'.

Mais si vous avez des difficultés avec ce système, vous pouvez essayer d'utiliser SolutionDir.

$(SolutionDir) Répertoire de la solution (défini comme le lecteur + le chemin) ; inclut la barre oblique inversée de fin de ligne '\'.

0 votes

Merci mais j'ai déjà essayé et ça ne marche pas. Je ne pense pas que les macros soient prises en charge pour le paramètre "Démarrer un programme externe".

0 votes

Avez-vous essayé votre suggestion ? Les macros ne fonctionnent pas dans ce cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X