« Visual Studio » : différence entre les versions
Aucun résumé des modifications |
|||
(11 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
[[Category:VisualStudio]] | |||
= Configurations DEBUG et RELEASE = | = Configurations DEBUG et RELEASE = | ||
== DEBUG == | == DEBUG == | ||
Ligne 112 : | Ligne 113 : | ||
{{warn | Attention si la version d'assemblage est définie avec l'* et que la version de fichier n'est pas définie. Alors à chaque compilation les 3 versions sont modifiées. Cela peut poser problème avec le chemin vers les settings utilisateurs : « C:\Users\''login''\AppData\Local\''company''\''ProductName''\''ProductVersion'' » qui changera lui aussi à chaque compilation.}} | {{warn | Attention si la version d'assemblage est définie avec l'* et que la version de fichier n'est pas définie. Alors à chaque compilation les 3 versions sont modifiées. Cela peut poser problème avec le chemin vers les settings utilisateurs : « C:\Users\''login''\AppData\Local\''company''\''ProductName''\''ProductVersion'' » qui changera lui aussi à chaque compilation.}} | ||
=Update Version= | = Update Version = | ||
Petit programme permettant de modifier le fichier AssemblyInfo.cs, téléchargeable [http://updateversion.codeplex.com ici].<br/> | Petit programme permettant de modifier le fichier AssemblyInfo.cs, téléchargeable [http://updateversion.codeplex.com ici].<br/> | ||
A utiliser en ligne de commande de l'événement de génération d'un projet afin que son numéro de version soit le même que le ''ProjetPrincipal'' : | A utiliser en ligne de commande de l'événement de génération d'un projet afin que son numéro de version soit le même que le ''ProjetPrincipal'' : | ||
<kode lang='dos'> | |||
< | |||
UpdateVersion -r Fixed -i "$(SolutionDir)ProjetPrincipal\Properties\AssemblyInfo.cs" -o "$(ProjectDir)Properties\AssemblyInfo.cs" | UpdateVersion -r Fixed -i "$(SolutionDir)ProjetPrincipal\Properties\AssemblyInfo.cs" -o "$(ProjectDir)Properties\AssemblyInfo.cs" | ||
</ | </kode> | ||
= [http://visualstudiohacks.com/articles/visual-studio-net-platform-target-explained AnyCPU, x86, x64] = | = [http://visualstudiohacks.com/articles/visual-studio-net-platform-target-explained AnyCPU, x86, x64] = | ||
Ligne 191 : | Ligne 188 : | ||
</kode> | </kode> | ||
==Copie récursive d'un dossier== | == Copie récursive d'un dossier == | ||
<kode lang='vs'> | |||
< | |||
REM Si Destination n'existe pas, il est créé. | REM Si Destination n'existe pas, il est créé. | ||
xcopy /y "$(SolutionDir)Source" "$(TargetDir)Destination\" | xcopy /y "$(SolutionDir)Source" "$(TargetDir)Destination\" | ||
</ | </kode> | ||
==Exécution d'un fichier bat== | == Exécution d'un fichier bat == | ||
<kode lang='vs'> | |||
< | |||
if exist $(TargetDir)File.bat $(TargetDir)File.bat | if exist $(TargetDir)File.bat $(TargetDir)File.bat | ||
</ | </kode> | ||
==Création d'un répertoire== | == Création d'un répertoire == | ||
<kode lang='vs'> | |||
< | |||
if not exist "$(TargetDir)NewFolder" md "$(TargetDir)NewFolder" | if not exist "$(TargetDir)NewFolder" md "$(TargetDir)NewFolder" | ||
</ | </kode> | ||
= [http://www.seirer.net/blog/2014/4/15/top-6-tips-for-automating-your-visual-studio-2013-post-build-event-with-powershell PowerShell et Event Build] = | = [http://www.seirer.net/blog/2014/4/15/top-6-tips-for-automating-your-visual-studio-2013-post-build-event-with-powershell PowerShell et Event Build] = | ||
Ligne 241 : | Ligne 226 : | ||
Project → Properties → Build Events → Run the post-build event: Always}} | Project → Properties → Build Events → Run the post-build event: Always}} | ||
=Désassembler et réassembler une dll= | = Désassembler et réassembler une dll = | ||
Par exemple pour modifier le ''manifest'' d'une ''Interop''.<br/> | Par exemple pour modifier le ''manifest'' d'une ''Interop''.<br/> | ||
Cette commande va générer deux fichiers : Interop.txt et Interop.res. Le fichier txt peut être édité et modifié afin de modifier le ''manifest''. | Cette commande va générer deux fichiers : Interop.txt et Interop.res. Le fichier txt peut être édité et modifié afin de modifier le ''manifest''. | ||
<kode lang='dos'> | |||
< | |||
ildasm Interop.dll /output:Interop.txt | ildasm Interop.dll /output:Interop.txt | ||
</ | </kode> | ||
Cette commande va ré-assembler les fichier pour créer une dll. | Cette commande va ré-assembler les fichier pour créer une dll. | ||
<kode lang='dos'> | |||
< | |||
ilasm Interop.txt /resource:Interop.res /dll /output:Interop.dll | ilasm Interop.txt /resource:Interop.res /dll /output:Interop.dll | ||
</ | </kode> | ||
=Générer une dll d'Interop= | = Générer une dll d'Interop = | ||
Utiliser l'outil [http://msdn.microsoft.com/fr-fr/library/tt0cf3sx(VS.80).aspx Type Library Importer] (Tlbimp.exe) afin de convertir une bibliothèque COM en assembly de CLR. | Utiliser l'outil [http://msdn.microsoft.com/fr-fr/library/tt0cf3sx(VS.80).aspx Type Library Importer] (Tlbimp.exe) afin de convertir une bibliothèque COM en assembly de CLR. | ||
<kode lang='dos'> | |||
< | |||
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\TlbImp.exe" *.dll /out:Interop.*.dll | "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\TlbImp.exe" *.dll /out:Interop.*.dll | ||
</ | </kode> | ||
=A reference could not be added= | = A reference could not be added = | ||
[[File:visualstudio1.png|500px]]<br/> | [[File:visualstudio1.png|500px]]<br/> | ||
Utiliser l'outil [http://msdn.microsoft.com/fr-fr/library/tt0cf3sx(VS.80).aspx Type Library Importer] (Tlbimp.exe) afin de convertir une bibliothèque COM en assembly de CLR. | Utiliser l'outil [http://msdn.microsoft.com/fr-fr/library/tt0cf3sx(VS.80).aspx Type Library Importer] (Tlbimp.exe) afin de convertir une bibliothèque COM en assembly de CLR. | ||
<kode lang='dos'> | |||
< | |||
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\TlbImp.exe" *.dll /OUT:*.dll | "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\TlbImp.exe" *.dll /OUT:*.dll | ||
</ | </kode> | ||
=Référencer un projet ciblant un Framework .NET plus récent= | = Référencer un projet ciblant un Framework .NET plus récent = | ||
Ce problème est apparu avec VS2010. Si un projet référence un autre projet ou une dll ciblant un Framework .NET plus récent cela créé une erreur de compilation.<br/> | Ce problème est apparu avec VS2010. Si un projet référence un autre projet ou une dll ciblant un Framework .NET plus récent cela créé une erreur de compilation.<br/> | ||
<u>Exemple:</u> ProjetA cible Framework 2, ProjetB cible Framework 3.5 et ProjetA contient une référence vers ProjetB.<br/> | <u>Exemple:</u> ProjetA cible Framework 2, ProjetB cible Framework 3.5 et ProjetA contient une référence vers ProjetB.<br/> | ||
<u>Solution:</u> Editez le fichier ProjetA.csproj | <u>Solution:</u> Editez le fichier ProjetA.csproj | ||
<kode lang="xml"> | |||
< | |||
<ProjectReference Include="..\ProjetB.csproj"> | <ProjectReference Include="..\ProjetB.csproj"> | ||
<Project>{8DD71CAF-BEF7-40ED-9DD0-25033CD8009D}</Project> | <Project>{8DD71CAF-BEF7-40ED-9DD0-25033CD8009D}</Project> | ||
Ligne 295 : | Ligne 262 : | ||
<SpecificVersion>true</SpecificVersion> <!-- LIGNE A AJOUTER --> | <SpecificVersion>true</SpecificVersion> <!-- LIGNE A AJOUTER --> | ||
</ProjectReference> | </ProjectReference> | ||
</ | </kode> | ||
=Ajouter l'option LARGEADDRESSAWARE à la compilation= | = Ajouter l'option LARGEADDRESSAWARE à la compilation = | ||
Ajoutez un événement de post-build : | Ajoutez un événement de post-build : | ||
<kode lang='dos'> | |||
< | |||
REM DevEnvDir = C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE | REM DevEnvDir = C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE | ||
REM charger l'environnement Visual Studio console pour avoir accès à editbin | REM charger l'environnement Visual Studio console pour avoir accès à editbin | ||
Ligne 309 : | Ligne 272 : | ||
editbin /LARGEADDRESSAWARE "$(TargetPath)" | editbin /LARGEADDRESSAWARE "$(TargetPath)" | ||
</ | </kode> | ||
Pour les tests, désactivez le processus d'hébergement VS pour utiliser MonApplication.exe au lieu de MonApplication.vshost.exe dont les options ne seront jamais modifiée :<br/> | Pour les tests, désactivez le processus d'hébergement VS pour utiliser MonApplication.exe au lieu de MonApplication.vshost.exe dont les options ne seront jamais modifiée :<br/> | ||
Projet → Propriétés → Déboguer → Décochez « Activer le processus d'hébergement VS » | Projet → Propriétés → Déboguer → Décochez « Activer le processus d'hébergement VS » | ||
Dernière version du 30 septembre 2020 à 11:31
Configurations DEBUG et RELEASE
DEBUG
- DebugSymbols → true
- DebugType → full
- Optimize → false
RELEASE
- DebugSymbols → true
- DebugType → pdbonly
- Optimize → true
Stopper sur toutes les exceptions
Debug Toolbar (à ajouter au besoin) → Exceptions
Recherche avec expressions rationnelles
\[FieldAttribute\("([\w =,\"\{\}:-]+)"\)\] [FieldAttribute("$1")]\r\n\t\t[Sql]
Comparaison entre 2 fichiers
devenv.exe /Diff fichier1.txt fichier2.txt vsdiffmerge fichier1.txt fichier2.txt REM /t open the comparison in a ProvisionalTab |
Build Action Property
Build Action | Description |
---|---|
None | The file is not included in the project output group and is not compiled in the build process. An example is a text file that contains documentation, such as a Readme file. |
Compile | The file is compiled into the build output. This setting is used for code files. |
Content | The file is not compiled, but is included in the Content output group. For example, this setting is the default value for an .htm or other kind of Web file. Allows you to retrieve a file (in same dir as assembly) as a stream via Application.GetContentStream( uri ). |
Embedded Resource | This file is embedded in the main project build output as a DLL or executable. It is typically used for resource files. |
Task List
View → Task List (Comments)
// TODO // HACK // UNDONE |
Il est possible de rajoute des tokens: TOOLS → Options → Environment → Task List
Debug et Trace Write
Pour que le Debug et Trace puissent écrire dans la fenêtre Output, il faut activer les constantes DEBUG et TRACE dans les propriétés du projet → Build
Visual Studio Command Prompt
- Developer Command Prompt for VS2013
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat"" - VS2013 x86 Native Tools Command Prompt
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"" x86 - VS2013 x64 Native Tools Command Prompt
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"" amd64 - VS2013 x64 Cross Tools Command Prompt
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"" x86_amd64 - VS2013 ARM Cross Tools Command Prompt
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"" x86_arm
Récupérer une ConnectionString
- View → Server Explorer
- Connect to Database
- Sélectionner une base de donnée → dans la Properties Windows → Connection String
Débugger le Framework .NET
COM
API Windows
Dans VS ajouter une référence COM vers la DLL choisie. Utiliser le champs de recherche car le nom de la DLL n'est pas le même que le nom du fichier.
Exemple : Shell32
Erreur
Impossible d'incorporer le type interop '...'. Utilisez l'interface applicable à la place.
Allez dans les propriétés de la référence et passer la propriété "Incorporer les types d'interopérabilité" à False.
Icônes
Une première icône peut être placée dans les propriétés de l’exécutable. D'autres icônes peuvent être placées dans les fenêtres.
Une icône doit contenir plusieurs images de différents format, afin de pouvoir être afficher quelque soit le système d'exploitation. Le logiciel IcoFX permet de faire cela.
Fichiers *.pdb
Un fichier PDB (base de données du programme) permet entre autre d'obtenir les numéros des lignes ayant générés des exceptions. Il est généré aussi bien en mode DEBUG que RELEASE.
Version d'assemblage, de fichier et de produit
AssemblyInfo.cs |
// version d'assemblage [assembly: AssemblyVersion("1.0.*")] // version de fichier [assembly: AssemblyFileVersion("1.1.0.0")] // version de produit [assembly: AssemblyInformationalVersion("1.2.0.0")] |
Valeurs par défaut :
- Si la version d'assemblage n'est pas explicitement définie, elle prend la valeur 0.0.0.0.
- Si la version de fichier n'est pas explicitement définie, elle prend la valeur de la version d'assemblage.
- Si la version de produit n'est pas explicitement définie, elle prend la valeur de la version de fichier.
Utilisation de « * » dans la version d'assemblage :
- 1.0.* sera remplacé par 1.0.d.s
- 1.0.0.* sera remplacé par 1.0.0.s
Où « d » est le nombre de jours depuis le 1er février 2000 et « s » le nombre de secondes depuis minuit divisé par 2.
Seul la version d'assemblage peut utiliser « * ». |
Dans Explorer d'XP les propriétés de fichiers permettent d'afficher les 3 version. Dans Vista et 7, la version d'assemblage n'est pas visible, il faut donc utiliser Reflector pour l'afficher. |
Attention si la version d'assemblage est définie avec l'* et que la version de fichier n'est pas définie. Alors à chaque compilation les 3 versions sont modifiées. Cela peut poser problème avec le chemin vers les settings utilisateurs : « C:\Users\login\AppData\Local\company\ProductName\ProductVersion » qui changera lui aussi à chaque compilation. |
Update Version
Petit programme permettant de modifier le fichier AssemblyInfo.cs, téléchargeable ici.
A utiliser en ligne de commande de l'événement de génération d'un projet afin que son numéro de version soit le même que le ProjetPrincipal :
UpdateVersion -r Fixed -i "$(SolutionDir)ProjetPrincipal\Properties\AssemblyInfo.cs" -o "$(ProjectDir)Properties\AssemblyInfo.cs" |
AnyCPU, x86, x64
Le mode AnyCPU permet à l'assemblage d'être lancée en 32 ou 64 bits en fonction de l'application appelante ou du système d'exploitation.
Les modes x86 et x64 forcent respectivement l'utilisation de l'assemblage en 32 bits et 64bits.
Il est intéressant de forcer la compilation en x86 si l'assemblage doit utiliser une DLL 32 bits, car un assemblage chargé en 64 bits ne peut utiliser de DLL 32 bits et inversement.
32 bits ou 64 bits
Depuis la console VS, lancez l'outil « CorFlags Assembly.dll ».
PE | 32BIT | |
anycpu | PE32 | 0 |
x86 | PE32 | 1 |
64-bits | PE32+ | 0 |
Signer un assemblage
Dans les propriétés du projet → onglet Signature, cocher Signer l'assembly.
Dans Choisir un fichier de clé de nom fort, sélectionnez Nouveau.
La fenêtre Créer une clé de nom fort s'affiche. Entrer un nom qui correspondra au nom du fichier snk qui sera créé.
Attention toutes les références d'un assemblage avec un nom fort doivent avoir des noms fort.
Build event command line in VS
Permet d’exécuter du code lors de la compilation.
VS met ce code dans un fichier batch et l’exécute. Ainsi les commandes batch habituelle sont utilisables (REM, GOTO, ECHO, XCOPY).
Copie du fichier cible si la compilation se fait en Release
L'option /y de la commande copy force l'écrasement sans confirmation de l'utilisateur.
if $(ConfigurationName)==Release copy /y "$(TargetPath)" "$(ProjectDir)" |
Copie de fichiers et dossiers avec Robocopy
REM copie de tous les fichiers *.dll du répertoire source vers TargetDir : Robocopy "$(SolutionDir)Source" "$(TargetDir)\" "*.dll" REM un \ supplémentaire est ajouté à la fin de $(TargetDir). $(TargetDir)=...\bin\debug\ REM Robocopy "...\bin\debug\" : ici le deuxième " est annulé par le \ REM C'est pourquoi ajouter un \ supplémentaire règle le problème : Robocopy "...\bin\debug\\" REM copie récursive d'un dossier. Si Destination n'existe pas, il est créé. Robocopy "$(SolutionDir)Source" "$(TargetDir)Destination" REM code de retour de Robocopy: 0-3 ok, 4-16 erreur. REM VS interprète un code de retour supérieur à 1 comme une erreur. Donc 0-3 -> 0 et 4-16 -> 1 if errorlevel 4 exit 1 if errorlevel 0 exit 0 REM attention exit quitte le script, les commandes qui suivent ne sont pas exécutées if errorlevel 0 goto next :next commande exit 0 ROBOCOPY "$(TargetDir)\" "$(SolutionDir)Dossier" $(TargetFileName) if errorlevel 4 exit 1 ROBOCOPY "$(ProjectDir)Dossier" "$(SolutionDir)Dossier" *.pdf /A-:R if errorlevel 4 exit 1 if errorlevel 0 exit 0 |
Copie de tous les fichiers du dossier mais pas les sous-dossiers
copy /y "$(ProjectDir)*.*" "$(TargetDir)" |
Copie récursive d'un dossier
REM Si Destination n'existe pas, il est créé. xcopy /y "$(SolutionDir)Source" "$(TargetDir)Destination\" |
Exécution d'un fichier bat
if exist $(TargetDir)File.bat $(TargetDir)File.bat |
Création d'un répertoire
if not exist "$(TargetDir)NewFolder" md "$(TargetDir)NewFolder" |
PowerShell et Event Build
powershell "&'$(ProjectDir)postbuild.ps1' '$(ProjectDir)\' '$(TargetDir)\' '$(OutDir)\' '$(ConfigurationName)'" |
Param ( [string] $ProjectDir, [string] $TargetDir, [string] $OutDir, [string] $ConfigurationName ) $ErrorActionPreference = 'Stop' if ($ConfigurationName -eq 'Release') { ... } [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [void][System.Windows.Forms.MessageBox]::Show("debug") |
Configurer le projet pour que le post-build event soit exécuté à chaque compilation Project → Properties → Build Events → Run the post-build event: Always |
Désassembler et réassembler une dll
Par exemple pour modifier le manifest d'une Interop.
Cette commande va générer deux fichiers : Interop.txt et Interop.res. Le fichier txt peut être édité et modifié afin de modifier le manifest.
ildasm Interop.dll /output:Interop.txt |
Cette commande va ré-assembler les fichier pour créer une dll.
ilasm Interop.txt /resource:Interop.res /dll /output:Interop.dll |
Générer une dll d'Interop
Utiliser l'outil Type Library Importer (Tlbimp.exe) afin de convertir une bibliothèque COM en assembly de CLR.
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\TlbImp.exe" *.dll /out:Interop.*.dll |
A reference could not be added
Utiliser l'outil Type Library Importer (Tlbimp.exe) afin de convertir une bibliothèque COM en assembly de CLR.
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\TlbImp.exe" *.dll /OUT:*.dll |
Référencer un projet ciblant un Framework .NET plus récent
Ce problème est apparu avec VS2010. Si un projet référence un autre projet ou une dll ciblant un Framework .NET plus récent cela créé une erreur de compilation.
Exemple: ProjetA cible Framework 2, ProjetB cible Framework 3.5 et ProjetA contient une référence vers ProjetB.
Solution: Editez le fichier ProjetA.csproj
<ProjectReference Include="..\ProjetB.csproj"> <Project>{8DD71CAF-BEF7-40ED-9DD0-25033CD8009D}</Project> <Name>ProjetB</Name> <SpecificVersion>true</SpecificVersion> <!-- LIGNE A AJOUTER --> </ProjectReference> |
Ajouter l'option LARGEADDRESSAWARE à la compilation
Ajoutez un événement de post-build :
REM DevEnvDir = C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE REM charger l'environnement Visual Studio console pour avoir accès à editbin call "$(DevEnvDir)..\tools\vsvars32.bat" editbin /LARGEADDRESSAWARE "$(TargetPath)" |
Pour les tests, désactivez le processus d'hébergement VS pour utiliser MonApplication.exe au lieu de MonApplication.vshost.exe dont les options ne seront jamais modifiée :
Projet → Propriétés → Déboguer → Décochez « Activer le processus d'hébergement VS »