Let There Be Code RSS 2.0
# Friday, March 04, 2011

Le millésime 2011 de la Bewise Day Conference est annoncé pour le 7 avril et se déroulera au casino Barrière à Toulouse.

Vous pouvez d’ores et déjà vous y inscrire depuis le site BDC2011 et suivre l’évènement depuis sa page facebook.

Cette année j’animerai une session sur Windows Azure et vous me retrouverez également sur l’ATE Windows Azure.

Une petite vidéo de teasing où comme souvent dans les vidéos de Bewise nous apercevons notre ami Guillaume L. :

Friday, March 04, 2011 10:16:00 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
BDC 2011

Avec l’un de mes collègues, nous avons récemment eu un débat autour de cette question, que nous avons fini par élucider. Voici le contexte : nous avons une classe A et une classe B, aucun héritage n’existe entre ces 2 classes, par contre nous redéfinissons l’opérateur de cast explicite de cette manière :

   1:  public class B
   2:  {
   3:  }
   4:   
   5:  public class A
   6:  {
   7:      public static explicit operator B(A a)
   8:      {
   9:          return new B();
  10:      }
  11:  }

Une fois que nous avons défini ces 2 classes, il est tout à fait possible d’effectuer un cast entre un objet A et un objet B :

   1:  A a = new A();
   2:   
   3:  B b = (B)a;

 

Maintenant que ce passe-t-il si on instancie une liste d’objets A et que l’on appelle la méthode d’extension Cast<T> comme ceci :

   1:  var list = new List<A>() { new A(), new A() };
   2:  list.Cast<B>().ToList();

 

Et bien à l’exécution, notre opérateur de cast explicite n’est pas appelé. Par contre une exception InvalidCastException est levée. La première réponse que l’on m’a donné était de dire que la méthode d’extension Cast<T> ne fait pas un cast…

Utilisons notre outil préféré (ou presque puisqu’il va bientôt devenir payant… ;)) Reflector. En reflectant la méthode Cast<T>, on peut voir qu’elle fait appel à la classe CastIterator. Celle-ci est tout simplement un itérateur sur notre collection qui dans la méthode MoveNext affecte à l’objet courant l’objet casté :

image

Donc oui la méthode Cast<T> fait un cast… d’après le code C#.  Car en fait, plus précisément, elle fait une opération de type unbox.any, comme le montre le code IL suivant :

image

C’est justement là qu’est notre problème. La classe CastIterator ne connait pas notre type A et elle itère sur une liste de type IEnumerable. Donc pour la classe CastIterator, nos objets sont de type System.Object. A cet endroit, un cast est effectué entre un objet de type System.Object et un type TResult. Du coup il fait un unbox (équivalent à l’opérateur castclass).

Décompilons maintenant le code écrit au tout début de ce post, qui caste notre variable de type A en type B :

image

Nous voyons bien que le compilateur a trouvé notre opérateur explicite et donc l’appelle pour effectuer la conversion.

Pour reproduire ce qu’il se passe au niveau du CastIterator, il suffit d’écrire ceci :

   1:  A a = new A();
   2:   
   3:  object o = a;
   4:   
   5:  B b = (B)o;

Et ici, le compilateur fait appel à l’opérateur castclass et non à notre opérateur de cast explicite :

image

Pour palier ce problème nous avons 2 solutions. La 1ère consiste à effectuer le cast soit même dans un Select :

   1:  var list = new List<A>() { new A(), new A() };
   2:  var result = list.Select(a => (B) a);

La seconde solution consiste a utiliser le mécanisme de Reflection pour retrouver l’existence de l’opérateur. On peut ainsi définir la méthode d’extension suivante :

   1:  public static class EnumarableExtensions
   2:  {
   3:      public static MethodInfo GetMethod(Type toSearch, string methodName, Type returnType, BindingFlags bindingFlags)
   4:      {
   5:          return Array.Find(toSearch.GetMethods(bindingFlags), delegate(MethodInfo inf) { return ((inf.Name == methodName) && (inf.ReturnType == returnType)); });
   6:      }
   7:   
   8:      public static IEnumerable<T> DynamicCast<T>(this IEnumerable list)
   9:      {
  10:          foreach (var obj in list)
  11:          {
  12:              Type ot = obj.GetType();
  13:              MethodInfo meth = GetMethod(ot, "op_Implicit", typeof(T), BindingFlags.Static | BindingFlags.Public);
  14:   
  15:              if (meth == null)
  16:              {
  17:                  meth = GetMethod(ot, "op_Explicit", typeof(T), BindingFlags.Static | BindingFlags.Public);
  18:              }
  19:   
  20:              if (meth == null)
  21:                  yield return (T)obj;
  22:              else
  23:                  yield return (T)meth.Invoke(null, new[] { obj });
  24:          }
  25:   
  26:      }
  27:  }

Et notre appel se fait ainsi :

   1:  var list = new List<A>() { new A(), new A() };
   2:  var result = list.DynamicCast<B>();

 

Et voilà un mystère d’élucidé! :)

Friday, March 04, 2011 7:00:00 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
C#
# Thursday, March 03, 2011

imageAvec Entity Framework, et les outils de mapping objets relationnels de manière générale, les développeurs écrivent facilement des requêtes Linq To Entities sans savoir le SQL qui est réellement exécuté côté serveur.

On perd la maitrise du SQL exécuté, et ceci peut faire peur à nos chers administrateurs SQL. Dans cette article je vous propose de comparer les plans d’exécution des requêtes générées par Entity Framework et des requêtes que nous aurions écrit à la main.

Thursday, March 03, 2011 10:48:38 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Entity Framework 4.0 | SQL Server
# Friday, February 04, 2011

imageLabs est un site dédié aux technologies Microsoft dont le but est de partager nos connaissances et notre passion.

Vous y retrouverez tous les articles, projets, KB, études de cas ainsi que les blogs des consultants de Bewise.

N’hésitez pas à nous envoyer vos retours.

Friday, February 04, 2011 9:00:00 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Bewise
# Tuesday, February 01, 2011

Capture J-7 avant l’édition 2011 des Techdays. Je serai au rendez-vous et j’animerai avec Alain Marty la session TFS Basic sur le parcours ALM.

Vous pourrez également me croiser du côté des exposants et des partenaires Inner Circle et Azure Circle toute la journée du 8 février.

Pour retrouver tous les speakers Bewise c’est pas .

Tuesday, February 01, 2011 2:20:45 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Techdays 2011
# Thursday, January 27, 2011

Depuis bientôt 3 mois que Kinect est sorti, on peut voir sur le web beaucoup d’initiatives de R&D utilisant ce périphérique. Vertice, la petite soeur de Bewise a elle aussi investit un peu de son temps sur Kinect. Il est maintenant possible de se déplacer dans une scène 3D temps réel Nova grâce à Kinect. Ajoutez à ça l’écran et les lunettes 3D... :)

Un petit aperçu ci-dessous :

 

Vertice présentera cette nouveauté au salon Imagina 2011 qui se déroulera du 1er au 3 février prochain. Retrouvez également toute l’actualité Vertice sur son blog.

Thursday, January 27, 2011 12:10:54 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Kinect
# Wednesday, January 26, 2011

L’accès au bureau distant d’une instance Azure est une autre nouveauté de la plateforme. L’activation peut se configurer depuis Visual Studio au moment du déploiement ou depuis le portail Azure.

Depuis Visual Studio, lorsque l’on déploie nos services Azure la fenêtre suivante s’ouvre :

image

Depuis ce wizard, il suffit de cliquer sur le lien “Configure Remote Desktop connections…”, puis de renseigner le formulaire :

image

Le premier champ correspond au certificat qui va permettre de crypter le mot de passe. On peut soit en choisir un dans la liste, soit en créer un. Il suffit ensuite de remplir les informations de connexion. Une fois ce formulaire rempli, Visual Studio stocke ces informations dans le fichier ServiceConfiguration.cscg de notre projet Azure :

image

Pour qu’Azure puisse de son côté décrypter le mot de passe, il faut déployer le certificat sur notre “Hosted Service”.

Dans un premier temps, nous allons exporter le certificat. Depuis le wizard de configuration de l’accès distant, il suffit de cliquer sur le bouton View afin d’afficher le certificat :

image

Dans l’onglet Details, cliquer sur “Copy to File…” pour l’exporter.

Au moment de l’export du certificat ne pas oublier de sélectionner l’option d’export de la clé privé :

image

Une fois le certificat exporté, il ne reste plus qu’à se connecter au portail Azure, accéder à notre Hosted Service, puis d’y télécharger le certificat :

image

Après avoir déployé nos rôles sur Azure, il est également possible d’activer/désactiver et configurer le bureau distant depuis le portail pour chacun des rôles :

image

Lorsque nos instances sont démarrées, nous pouvons nous connecter en remote :

image

Wednesday, January 26, 2011 1:03:00 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Azure
# Sunday, January 23, 2011

Si vous avez suivi l’actualité d’Azure, vous avez pu voir que Microsoft avait annoncé que les fonctionnalités d’IIS seraient disponible au niveau des Web Role. Nous pouvons donc configurer notre Web Role afin d’y définir les sites, répertoires virtuels ou encore les applications comme nous le souhaitons.

A l’ajout d’un projet Azure à notre solution Visual Studio, nous allons choisir de déployer un Web Role.

AddWebRole

Nous allons ajouter 2 sites web supplémentaires à notre solution.

Solution

Examinons maintenant le fichier ServiceDefinition.csdef de notre projet Azure :

<ServiceDefinition name="AzureProject" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="WebRoleSample">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="Endpoint1" endpointName="Endpoint1" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="Endpoint1" protocol="http" port="80" />
    </Endpoints>
    <Imports>
      <Import moduleName="Diagnostics" />
    </Imports>
  </WebRole>
</ServiceDefinition>

 

Dans ce fichier, on peut voir la définition de notre Web Role.

Il contient un site nommé “Web” disponible en http sur le port 80. Nous pouvons observer que l’élément xml Site possède comme élément parent “Sites”. Nous allons définir nos autres sites de cette manière :

<ServiceDefinition name="AzureProject" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="WebRoleSample">
    <Sites>
      <Site name="Web">
        <VirtualDirectory name="Images" physicalDirectory="../PremierSiteWeb/Img">
        </VirtualDirectory>
        <Bindings>
          <Binding name="Endpoint1" endpointName="Endpoint1" />
        </Bindings>
      </Site>
      <Site name="PremierSite" physicalDirectory="../PremierSiteWeb">
        <VirtualApplication name="SecondSite" physicalDirectory="../SecondSiteWeb">
        </VirtualApplication>
        <Bindings>
          <Binding name="Endpoint2" endpointName="Endpoint2"/>
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="Endpoint1" protocol="http" port="80" />
      <InputEndpoint name="Endpoint2" protocol="http" port="81" />
    </Endpoints>
    <Imports>
      <Import moduleName="Diagnostics" />
    </Imports>
  </WebRole>
</ServiceDefinition>

 

Dans le premier, nous avons ajouté un répertoire virtuel “Images” qui pointe sur le répertoire “../PremierSiteWeb/Img”. Nous avons ensuite déployé le site PremierSiteWeb en http sur le port 81. Puis dans ce site, nous avons défini une application virtuelle qui pointe sur le projet SecondSiteWeb. Lorsque nous déployons localement notre web role (F5), 2 navigateurs s’ouvrent sur les 2 sites. Si nous ouvrons la console d’administration d’IIS, nous retrouvons les 2 sites, le répertoire virtuel, ainsi que l’application :

IIS

Ici mon IIS local possède déjà un site sur le port 80. Pour le déploiement local, Visual Studio a publié mes sites sur les ports 81 et 82.

Après avoir déployé notre Web Role sur Azure, nous pouvons nous connecter en remote desktop à notre VM Azure, accéder au serveur IIS et vérifier que nos 2 sites ont bien été déployés :

image

Sunday, January 23, 2011 1:36:27 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Azure
# Thursday, December 09, 2010

Brian Harry a annoncé cette semaine la sortie des Service Packs 1 de Visual Studio et de Team Foundation Server 2010 en version Beta. Ils sont actuellement disponibles uniquement pour les abonnés MSDN, mais devraient être téléchargeable par tout le monde dans les jours qui suivent.

Vous pouvez retrouver plus de détails sur le contenu de ces Service Packs directement sur son blog. Il précise notamment que près de 1000 bugs ont été corrigés!! Ca fait rêver ;)

Parmi les nouvelles fonctionnalités nous pouvons noter qu’il sera maintenant possible d’exécuter les tests unitaires en 3.5. Actuellement les tests unitaires s’exécutent obligatoirement en 4.0 et utilisent la compatibilité 3.5 pour tester des applications 3.5.

On peut également noter une grande nouveauté au niveau de l’Intellitrace, c’est le support tant attendu du 64 bits (et de Sharepoint également). Comme je le soulignais dans cet article sur le développement 64 bits, Microsoft continue ses efforts à ce sujet.

Du côté de Silverlight, les tools de la version 4.0 sont inclus dans ce service pack. Au passage, Scott Guthrie nous annonçait la semaine dernière les nouveautés de Silverlight 5 qui devrait être disponible en version béta au printemps 2011 (surement pour le MIX). Et dans Silverlight 5, côté développeur et testeur on notera le support du debug des expressions de binding et le support des tests d’interfaces automatisés (déjà disponible pour Silverlight 4 dans le Feature Pack 2 de Visual Studio 2010).

Et enfin, toujours du côté de Silverlight, ce Service Pack contient un outil d’analyse des performances spécifique à Silverlight.

Thursday, December 09, 2010 10:08:17 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
TFS | Visual Studio
# Monday, October 11, 2010

Si vous avez testé TFS 2010 Beta 2, alors vous avez peut être remarqué qu’il était possible d’éditer les étapes des work items de type Test Case directement depuis Visual Studio. A l’arrivée de la RTM, cette fonctionnalité a été supprimée. Actuellement la seule façon d’éditer les étapes des Test Cases est de le faire depuis MTM (Microsoft Test Manager). Voici à quoi ressemble l’onglet Steps depuis Visual Studio, remarquez le bouton “Open for edit” qui permet de lancer MTM :

 TestCase

Avec la beta 2, nous avions ceci :

image

Nous allons voir ci-dessous comment modifier l’interface des Test Case pour pouvoir modifier les steps comme dans la beta 2.

En cherchant un peu on peut voir que le contrôle utilisé pour afficher les étapes est le custom control TestStepBaseControl de l’assembly Microsoft.TeamFoundation.TestManagement.Controls. Pour le retrouver il suffit de regarder à cet endroit : C:\ProgramData\Microsoft\Team Foundation\Work Item Tracking\Custom Controls\10.0\TestStepsControl.wicc

Comme tout custom control de work item, TestStepBaseControl implémente l’interface IWorkItemControl. Ce contrôle implémente également l’interface IWorkItemControlFactory. Il doit ainsi implémenter la méthode Create, que l’on peut voir ci-dessous :

Create

Visual Studio et MTM se servent certainement de cette méthode pour obtenir une instance de ce contrôle. Comme nous pouvons le voir dans ce code, si le Host a la possibilité d’afficher un contrôle WPF alors il retourne une instance de type TestStepsCustomControl, sinon il renvoie l’instance courante, à savoir de type TestStepsBaseControl.

Le formulaire des work items de Visual Studio ne supportent que les contrôles WinForm. C’est pour cette raison que TestStepsBaseControl est un UserControl WinForm. Par contrôle, MTM est en WPF, ainsi TestStepsCustomControl est un UserControl WPF.

Pour utiliser le contrôle TestStepsCustomControl depuis Visual Studio, il suffit de créer de l’encapsuler dans un composant ElementHost, lui même encapsuler dans un User Control WinForm (le composant ElementHost permet d’hoster un contrôle WPF dans un contrôle WinForm).

  • On crée un projet de type WinForm Custom Control Library.
  • On ajoute les références Microsoft.TeamFoundation.TestManagement.Controls.dll et Microsoft.TeamFoundation.WorkItemTracking.Controls.dll.
  • On ajoute ensuite un User Control et on lui fait implémenter l’interface IWorkItemControl.
  • Dans le designer du user control, on ajoute un composant ElementHost
  • Dans le code du designer, on crée un champ de type Microsoft.TeamFoundation.TestManagement.Controls.TestStepsCustomControl
  • Puis on modifie le code de la méthode InitializeComponent, afin d’instancier le TestStepsCustomControl et de l’affecter à la propriété Child de l’objet ElementHost :

 

InitializeComponent

  • Il faut ensuite mapper les méthodes de l’interface IWorkItemControl sur le custom control :

Mapping

  • Il ne reste plus qu’à compiler
  • On copie la sortie dans le répertoire C:\ProgramData\Microsoft\Team Foundation\Work Item Tracking\Custom Controls\10.0
  • On crée un fichier TestStepsControl2.wicc comme ceci :

wicc

Le contrôle est maintenant déployé. La dernière étape consiste à éditer le formulaire du Work Item pour qu’il utilise notre nouveau contrôle. Le plus simple est d’utiliser les power tools. Après avoir installé les power tools de TFS, il suffit d’éditer le type de work item Test Case (Menu Tools>Process Editor>Work Item Type>Open WIT from Server). Dans l’onglet Layout, on retrouve le TabPage Steps, il suffit de modifier la propriété Type du contrôle utilisé pour afficher le champ Microsoft.VSTS.TCM.Steps :

WIDesigner

La manip est terminée. Il ne reste plus qu’à ouvrir un Test Case et vérifier que les étapes sont maintenant éditable depuis Visual Studio :

image

Et comme par magie, on peut maintenant éditer les étapes de nos Test Case depuis Visual Studio!!

Monday, October 11, 2010 2:34:41 PM (Romance Daylight Time, UTC+02:00)  #    Voir Commentaires
TFS | TFS SDK | Visual Studio
Archive
<March 2011>
SunMonTueWedThuFriSat
272812345
6789101112
13141516171819
20212223242526
272829303112
3456789
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2012
Benoît Laut
Sign In
All Content © 2012, Benoît Laut
DasBlog theme 'Business' created by Christoph De Baene (delarou)