Visual Studio

De Banane Atomic
Révision datée du 15 novembre 2017 à 16:03 par Nicolas (discussion | contributions) (→‎Sandcastle)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigationAller à la recherche

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

Dos.svg
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.

http://stackoverflow.com/questions/145752/what-are-the-various-build-action-settings-in-vs-net-project-properties-and-wh

Task List

View → Task List (Comments)

Csharp.svg
// 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

  1. View → Server Explorer
  2. Connect to Database
  3. Sélectionner une base de donnée → dans la Properties Windows → Connection String

Débugger le Framework .NET

[1] [2] [3]

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 :

Dos.png
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.

Fichier:Visualstudio.png
if $(ConfigurationName)==Release copy /y "$(TargetPath)" "$(ProjectDir)"

Copie de fichiers et dossiers avec Robocopy

Fichier:Visualstudio.png
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

Fichier:Visualstudio.png
copy /y "$(ProjectDir)*.*" "$(TargetDir)"

Copie récursive d'un dossier

Fichier:Visualstudio.png
REM Si Destination n'existe pas, il est créé.
xcopy /y "$(SolutionDir)Source" "$(TargetDir)Destination\"

Exécution d'un fichier bat

Fichier:Visualstudio.png
if exist $(TargetDir)File.bat $(TargetDir)File.bat

Création d'un répertoire

Fichier:Visualstudio.png
if not exist "$(TargetDir)NewFolder" md "$(TargetDir)NewFolder"

PowerShell et Event Build

Dos.svg
powershell "&'$(ProjectDir)postbuild.ps1' '$(ProjectDir)\' '$(TargetDir)\' '$(OutDir)\' '$(ConfigurationName)'"
Powershell.svg
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.

Dos.png
ildasm Interop.dll /output:Interop.txt

Cette commande va ré-assembler les fichier pour créer une dll.

Dos.png
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.

Dos.png
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\TlbImp.exe" *.dll /out:Interop.*.dll

A reference could not be added

Visualstudio1.png
Utiliser l'outil Type Library Importer (Tlbimp.exe) afin de convertir une bibliothèque COM en assembly de CLR.

Dos.png
"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

Fichier:Xml.png
<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 :

Dos.png
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 »