[VS 2010] Créer des snippets pour augmenter votre productivité

Visual Studio 2010 utilise comme beaucoup d’IDE, un système de snippet permettant d’augmenter la vitesse de frappe du code.

 

Utilisation d’une snippet

 

Par exemple, si vous entrez "propf" puis tapez 2 fois sur la touche TAB du clavier, l’IDE va générer pour vous une propriété privée ainsi qu’un get, set :

 

 

Les zones oranges sont les zones éditables lors de la création. Il est possible de passer d’un de ces champs à un autre en pressant la touche TAB du clavier.

 

il est existe un grand nombre de snippets déjà définies dans Visual Studio (if, while, prop, propf, etc.). Pour en voir la liste, faites un clic droit dans le code -> Insert Snippet ou plus rapidement en faisant un Ctrl + K, X. Les snippets de Visual Studio sont en fait des fichiers XML disponibles dans le dossier : C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC#\Snippets\1033\Visual C# pour les snippets relatives au C#.

 

Création d’une snippet

 

Il est également possible de créer vos propres snippets directement dans Visual Studio en créant un fichier XML ayant pour extension .snippet. La structure du fichier est définie comme ceci :

 

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>MyTitle</Title>
      <Shortcut>MyShortcut</Shortcut>
      <Description>My description</Description>
      <Author>MyName</Author>
      <SnippetTypes>
        <!-- snippet types -->
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>MyField</ID>
          <ToolTip>My field tooltip</ToolTip>
          <Default>MyDefaultValue</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[string $MyField$;]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

 

En détail :

  •  
  • Title : nom de votre snippet
  • Shortcut : raccourci à taper avant de presser la touche TAB 2 fois pour afficher le contenu de la snippet
  • Description : description de la snippet
  • Author : nom du créateur de la snippet
  • SnippetTypes : type de snippet
  •  

Les snippets peuvent être de 3 types :

  1. SurroundsWith : indique vous pouvez encapsuler votre code à l’intérieur de la snippet (ex : if)
  2. Expansion : indique que le code sera insérer au niveau du curseur de la souris (ex : prop)
  3. Refactoring : indique que la snippet est utilisée pour le refactoring (ex : implementation d’une interface et insertion du throw new NotImplementedException(); dans le corps des méthodes). Il n’est pas possible de créer ce type de snippet.

 

Dans la balise Declarations, chaque balise Literal représente un champ que l’on va pouvoir modifier lors de l’utilisation de la snippet. Dans l’exemple ci-dessus, par défaut la valeur de MyField sera MyDefaultValue, mais il sera possible de la modifier très facilement. Une fois la snippet créée, le curseur se placera au début du mot MyDefaultValue et le surlignera pour faciliter sa modification. Une fois la création de la snippet terminée, pressez la touche ENTRER.

Vous l’aurez compris cette snippet permet de créer une variable de type string.

 

Installation d’une snippet

 

Maintenant que la snippet est créée, il faut l’ajouter à Visual Studio. Pour cela rendez-vous dans le menu Tools -> Code Snippet Manager ou plus rapidement avec le raccourci Ctrk + K, B.

 

 

Cliquez ensuite sur Import… et choisissez le fichier .snippet que vous venez de créer. Visual Studio va alors ajouter votre snippet au dossier C:\Users\<Name>\Documents\Visual Studio 2010\Code Snippets\Visual C#\My Code Snippets. La snippet est maintenant disponible dans Visual Studio et ce pour tous vos projets.

[Livre] Visual Studio 2010 – Développez pour le web

Visual Studio 2010 – Développez pour le web est un livre écrit par Julien Dollon (@juliendollon) et James Ravaille, 2 MVPs, sur le développement complet d’une application web sur Visual Studio 2010 en .NET 4.

Tout le livre est construit sur la création d’une application en suivant les étapes une à une. Le projet final est également disponible en téléchargement sur le site de ENI.

Voici la table des matières :

– Architecture du logiciel
– Création du composant d’accès aux données
– Implémentation de la base de données
– Implémentation des règles et traitements métier
– Développement d’une application web avec ASP.NET 4
– Développement RIA avec Silverlight 4
– Création de la couche service
– Implémentation de la version Windows Phone 7

 

Ce que j’en pense

 

Ce que j’aime dans ce livre c’est qu’il ne se focalise pas sur une seule technologie (ASP.NET, Silverlight…) et une seule plateforme (web, mobile).  De plus il convient aux développeurs débutants souhaitant découvrir de nouvelles technologies, mais aussi aux développeurs plus expérimentés avec des concepts un peu plus poussés.

Un atout pour beaucoup de lecteurs, ce livre est écrit en français. On sait que toutes les références dans ce domaine sont écrits en anglais et font la plupart du temps plus de 600 pages ce qui peut en décourager plus d’un.

Contrairement à beaucoup de livres, ce livre ne comporte pas de longs passages théoriques un peu rébarbatifs, mais tout est illustré par un cas pratique. Le livre se lit donc très bien.

Pour le petit côté négatif, certains points pourraient être selon moi un peu plus explicités, ce qui peut bloquer les plus novices.

 

Conclusion

 

Un très bon livre sur les dernières technologies .NET (ASP.NET 4, SL 4, WP7) à posséder dans sa bibliothèque.

Pour vous procurer ce livre, rendez-vous sur Amazon.

[.NET] Se connecter en remote shell sur Windows Serveur avec WinRM et .NET

Windows Remote Management permet d’ouvrir à distance un shell sur Windows Server 2008 (WinRM existe depuis Windows Vista et Windows Server 2003 R2). Concrétement, il est possible d’exécuter des lignes de commandes sur un serveur à distance.

 

Pour des raisons évidentes de sécurité, certains pré-requis sont nécessaires. Si l’ordinateur client n’est pas sur le même domaine que le serveur, ou si l’authentification ne se fait pas par Kerberos alors les transmissions doivent être chiffrées. Concernant la ligne de commande, les droits sont respéctés. Un utilisateur qui ne présente pas les droits suffisants pour exécuter une commande sur le serveur se verra refuser l’exécution de la dite commande à distance.

 

Petite limitation, un utilisateur ne peut pas ouvrir plus de 5 "runspaces" à la fois.

Par défaut, sur Windows Serveur 2008 R2, WinRM n’est pas activée. Pour l’activer, ouvrez une invite de commande en tant qu’administrateur
et tapez la ligne suivante :

 

winrm quickconfig

 
C:\Windows\system32>winrm quickconfig
WinRM already is set up to receive requests on this machine.
WinRM already is set up for remote management on this machine.

 

Le serveur est maintenant prêt pour recevoir les requêtes des clients. Dans cet article, pour simplifier le processus, l’ordinateur client fait partie du même domaine que le serveur afin d’éviter le cryptage des transmissions.

 

Pour tester le code ci-dessous, les pré-requis sont :
– un windows serveur 2008 avec un domaine Active Directory
– un client sous windows
– un compte administrateur sur le domaine

 

Comme énoncé précédemment, pour éxécuter certaines commandes il faut être connecté avec un utilisateur ayant des droits spéciaux. Si vous êtes connecté à votre ordinteur client avec ce type d’utilisateur, il ne sera pas necessaire de passer à la connexion des informations d’authentification (login/mot de passe). En revanche, si vous êtes connecté avec un utilisateur basique, il faudra les spécifier au constructeur de la connexion.

 

L’utilisation de Windows Remote Shell en .NET se repose sur l’espace de noms System.Management.Automation.Runspaces. Pour ajouter ce namespace, ouvrez le fichier .csproj de votre projet avec un éditeur de texte (par exemple Notepad++) et cherchez le bloc de lignes contenant les références.

Par exemple :

 

<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />

 

Ajoutez en dessous la ligne :

 

<Reference Include="System.Management.Automation" />

 

Il est maintenant possible d’importer le namespace dans le fichier .cs :

 

using System.Management.Automation.Runspaces;

 

Tout est maintenant prêt pour commencer à développer.

La 1re étape consiste à construire un objet PSCredential pour nous identifier sur le serveur. Si cette étape est omise, le compte utilisateur qui exécute l’application sera utilisé. Le constructeur de PSCredential prend en paramètres une chaine de caractères représentant le nom d’utilisateur et un objet de type System.Security.SecureString qui stocke le mot de passe :

 

SecureString pwd = new SecureString();

foreach (char c in "P@ssw0rd".ToCharArray())
{
    pwd.AppendChar(c);
}

PSCredential cred = new PSCredential("Aymeric", pwd);

 

La 2ème étape établit la connexion vers le serveur. WSMANConnectionInfo prend en paramètre un booléen pour l’utilisation ou non du SSL, le nom du serveur, le port (5985 par défaut ou 5986 pour le SSL), le nom de l’application, un schéma et enfin les paramètres d’identification créés auparavant (null si l’on souhaite utiliser le compte actuellement connecté au poste client).

 

WSManConnectionInfo rri = 
    new WSManConnectionInfo(false,
        "serveur.aymeric.lan",
        5985,
        "/wsman",
        "http://schemas.microsoft.com/powershell/Microsoft.PowerShell",
        cred);

 

Une fois la connexion créée, on peut construire un RunSpace qui nous permettra d’exécuter les commandes à distance :

 

Runspace myRunSpace = RunspaceFactory.CreateRunspace(rri);
myRunSpace.Open();

 

Pour terminer, la classe Pipeline permet d’envoyer des commandes au serveur. Dans l’exemple ci-dessous, la commande ipconfig est envoyée au serveur. Le résultat de la commande est affiché dans la console du client :

 

Pipeline p = myRunSpace.CreatePipeline("ipconfig");

foreach (PSObject i in p.Invoke())
{
    Console.WriteLine(i.ToString());
}

 

Le projet utilisé dans l’article est disponible ici.

[.NET] Requêter Active Directory via .NET

Active Directory, le service d’annuaire de Microsoft se repose sur le protocole LDAP. Pouvoir se connecter à l’Active Directory, y ajouter des utilisateurs, des groupes, etc… est possible avec le framework .NET grâce au namespace System.DirectoryServices.

Avant de commencer le code, il faut ajouter une référence dans votre projet vers System.DirectoryServices.

 

Se connecter à Active Directory

 

La connexion se fait en 2 temps. Premièrement, on créé un DirectoryEntry avec le serveur, nom d’utilisateur, mot de passe, etc… Si une correspondance est faite dans l’AD, on continue. Si le couple utilisateur/mot de passe, l’adresse du serveur n’est pas bonne, etc… une exception de type DirectoryServicesCOMException sera levée. Si la connexion est faite, on pourra tester que pour se connecter, l’utilisateur doit être dans le groupe administrateur. Cette recherche se fait à l’aide d’un DirectorySearcher. La syntaxe du filtre est celle propre à LDAP. Le filtre utilisé ci-dessous, vérifie que l’utilisateur a bien pour nom « Aymeric », qu’il appartient au groupe administrateur et qu’il est bien de type « user ».

 

string host = "192.168.65.156";
string DN = "DC=aymeric,DC=lan";
string domain = "AYMERIC";
string user = "Aymeric";
string logonName = String.Format(@"{0}\{1}", domain, user);
string password = "Sup1nf0";
string path = String.Format("LDAP://{0}", host);

try
{
    // Connection
    DirectoryEntry de = new DirectoryEntry(path, user, password,
                                           AuthenticationTypes.Secure);

    DirectorySearcher ds = new DirectorySearcher(de);
    ds.Filter = "(&(&(objectClass=user)(memberOf=CN=Administrators,CN=Builtin," +
                DN + "))(samAccountName=" + user + "))";
    SearchResult result = ds.FindOne();

    if (result != null)
    {
        Console.WriteLine("Connected....");
    }
    else
    {
        Console.WriteLine("Connection Failed....");
    }
}
catch (DirectoryServicesCOMException ex)
{
    Console.WriteLine(ex.Message);
}
 

Ajout d’un nouvel utilisateur

 

La création d’un nouvel utilisateur passe par la création d’un nouveau DirectoryEntry à l’intérieur de celui déjà créé lors de la connexion à l’annuaire. Les informations relatives au nouvel utilisateur sont ensuite ajoutées via la collection de Properties que contient le DirectoryEntry. Le prénom, nom et surnom sont les seules propriétés spécifiées dans l’exemple ci-dessous.

Attention cependant à la propriété « memberOf« , qui contient les groupes auxquels appartient l’utilisateur. Cette propriété est en lecture seule et ne peut donc pas être modifiée. Pour ajouter un utilisateur dans un groupe, il faut partir du groupe en question (décrit plus tard dans l’article).

 

// Add a user
Console.WriteLine("Add a new user");

string firstName = "Scott";
string lastName = "Guthrie";
string username = "scottgu";
string container = "CN=Users";

string userPath = String.Format("CN={0},{1}", username, container);
DirectoryEntry newUser = de.Children.Add(userPath, "user");
newUser.Properties["samAccountName"].Value = username;
newUser.Properties["givenName"].Value = firstName;
newUser.Properties["sn"].Value = lastName;

newUser.CommitChanges();

string guid = newUser.Guid.ToString();

newUser.Invoke("SetPassword", new object[] { password });
newUser.CommitChanges();

Console.WriteLine("{0} {1} aka {2} is now administrator", 
    firstName, 
    lastName,
    username);

Comme expliqué ci-dessus, ce code est à mettre à la suite de celui établissant la connexion à la base de données. Les exceptions levées par ce code sont toujours du type DirectoryServicesCOMException.

Pour ajouter un groupe, le principe est le même. Dans le Add(), il faut simplement remplacer le 2ème paramètre par « group » et non « user« .

 

Ajouter un utilisateur à un groupe

 

Pour ajouter un utilisateur dans un groupe, il faut impérativement que l’utilisateur soit déjà créé, ce qui implique que l’on ne peut pas ajouter un utilisateur à un groupe de la même manière que son nom ou prénom. Il faut, comme expliqué plus haut dans l’article, ajouter un utilisateur via un groupe. Il faut donc recréer un DirectoryEntry qui représente le groupe en question, puis y ajouter l’utilisateur.

 

// Add scottgu user to Administrators group
Console.WriteLine("Add the new user in the Administrators group");

DirectoryEntry grp = de.Children.Find("CN=Administrators,CN=Builtin");
grp.Invoke("add", newUser.Path);

Console.WriteLine("{0} {1} aka {2} is now administrator", 
                  firstName, 
                  lastName, 
                  username);

 

Supprimer un utilisateur ou un groupe

 

Pour supprimer un utilisateur ou un groupe, il faut partir du DirectoryEntry initial (créé pour la connexion) et appeler la méthode Remove() en y passant le DirectoryEntry representant l’objet à supprimer. Dans l’exemple ci-dessous, on supprime l’utilisateur nouvellement créé.

 

de.Children.Remove(newUser);
de.CommitChanges();

Console.WriteLine("{0} {1} aka {2} is deleted", firstName, lastName, username);

 

Afin de libérer toute les ressources, il faut fermer les DirectoryEntry créés.

 

newUser.Close();
grp.Close();
de.Close();

Le projet utilisé pour cet article est disponible ici.

[VS 2010] Les 3 extensions à posséder sur Visual Studio 2010

Visual Studio 2010 intègre un module d’extensions afin de personnaliser ou ajouter des fonctionnalités à l’IDE.

 

Ce module d’extensions est disponible dans Tools -> Extension Manager ou via l’icône Extension manager de la barre d’outils.

 

Extension manager

Via la rubrique Online Gallery, vous pouvez ajouter simplement des extensions à Visual Studio 2010.

Dans cet article, je vous propose de découvrir 3 extensions qui à mon sens sont inévitables pour gagner du temps et de la lisibilité :

 

Productivity Power Tools

 

Ce module, le plus complet des 3 extensions présentées dans cet article ajoute une multitude de fonctionnalités qu’il n’est pas possible d’énumérer dans un seul article. Parmi les fonctionnalité les plus utiles :

  • En faisant Ctrl + Click sur une variable ou une méthode, Visual Studio 2010 ouvre le fichier contenant la définition de ce qui a été cliqué et surligne la 1re ligne de déclaration.
  • L’ajout de guideline (guide) dans une page de code permet d’aligner des éléments, ou de ne pas dépasser un certain nombre de caractères par ligne. Pour ajouter un guide, placez le curseur à l’endroit où vous souhaitez ajouter le guide, puis click droit -> Guidelines -> Add Guideline
  •  

Ajouter une guideline dans Visual Studio 2010

  •  
  • le Solution Navigator permet de classer les fichiers ouverts, édités, sauvegardés, etc…. Le solution Navigator se trouve à côté du Solution Explorer

Beaucoup d’autres fonctionnalités sont disponibles via ce module : auto-complétion, informations sur les variables, etc…

 

VS10x Code Map

 

Ce module ajoute sur la droite ou la gauche de la fenêtre de code une carte du code regroupé par régions, méthodes, etc… une simple click sur la méthode en question affiche la 1re ligne de la définition de la méthode dans la page de code. Ce module permet également de déplier ou replier toutes les régions contenu dans la page.

 

 Code map pour Visual Studio 2010

 

VS10x Method Block Highlighter

 

Ce module fonctionne avec VS10x Code Map et permet de surligner la définition complète d’une méthode lorsque l’on clique sur la méthode en question dans le Code Map décrit ci-dessus.

Un click droit sur une méthode dans le Code Map puis Highlight In Code -> Green permet de surligner toute la méthode de façon permanente en vert. Très utile pour se repérer rapidement dans le code.

 

Highlighter de méthodes pour Visual Studio 2010

 

Pour plus de modules rendez-vous sur le site de la galerie Visual Studio 2010.