Blog du Pôle .NET

Partager pour mieux développer...

Un profiler de mémoire bien sympathique…

clock August 20, 2009 12:23 by author lnyffels

Lors d’un précédent ticket, j’ai brièvement décrit comment invoquer un objet .NET à partir d’un client COM écrit en VB (non managé).

Pour rappel cela se fait par l’intermédiaire d’un wrapper CCW (COM Callable Wrapper). Le CCW est un objet COM non managé qui est créé par le CLR au même titre que l’objet .NET qu’il encapsule. Toutefois, contrairement au client .NET qu'il enveloppe, le wrapper CCW fait l'objet d'un décompte de références selon le mode COM standard. Quand le décompte de références du wrapper CCW atteint zéro, le wrapper libère sa référence à l'objet managé. Un objet managé sans aucune référence restante est collecté lors du cycle garbage collection suivant. (cf. lien msdn suivant : http://msdn.microsoft.com/en-us/library/f07c8z1c.aspx)

 

Aussi, il est nécessaire que le CCW soit « déréférencé » par le client COM VB pour que les objets managés .NET qu’il référence soient également détruits par le garbage collector. Etant de nature plutôt méfiante lorsqu’il s’agit d’interopérabilité COM / .NET et n’étant un as du VB ;-), il me paraissait utile de vérifier cela via un profiler de mémoire. J’avais utilisé il y a quelques années de cela chez un ce mes clients préférés l’utilitaire Optimize-it de Borland. Mais celui-ci n’a semble t’il plus évolué depuis le Framework 1.1. Il en existe beaucoup en .NET mais assez peu sont capables de remonter les objets managés et les objets non managés.   J’en ai trouvé un plutôt sympa qui m’a apporté le service que j’attendais. Il s’agit de « .NET Memory Profiler 3.1 » de la société SciTeck Software (http://memprofiler.com). Le soft m’a permis de m’attacher au processus client, de prendre des photos (snapshot) à différents intervalles et après plusieurs sollicitations je me suis aperçu que les objets .NET étaient bien libérés par le garbage collector. La preuve en 2 images… ;-)  

Snapshot 1 :

Snapshot 2 : 

Conclusion : l’interopérabilité COM / .NET, « ça marche pas pas si mal que cela » !

Laurent Nyffels 

 

 

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Définir un navigateur par défaut lors de son développement Web

clock August 20, 2009 07:55 by author crezenthel

Bonjour,  

Voici une petite astuce permettant de définir le navigateur par défaut dans VS lors d'un développement Web. 

-          Sélectionner dans le projet une page aspx        

-          Ensuite aller dans le menu Fichier/Naviguer avec  

 

-          Si vous ne trouvez pas votre navigateur dans la liste, faites « Ajouter »   

 

-          Indiquer le chemin de l’exécutable et nommer le.

-          Pour finir, choisir son navigateur et cliquer sur le bouton « Par défaut »

 

Et le tour est joué.

 

@+ Bientôt

Christophe REZENTHEL 

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Echanger des collections d’objets via « COM Callable Wrapper »

clock August 19, 2009 12:08 by author lnyffels

Confronté récemment à une problématique d’intéropérabilité VB / .NET, je souhaitais poster ce ticket qui je l’espère pourra servir à certains.

Nous avons tous un jour ou l’autre dû dans nos développements sous .NET invoquer un « vieux » composant COM réalisé en VB6, en C++ ou en Delphi… Cela se fait assez facilement dans Visual Studio 2005 ou 2008, et l’objet COM exposé apparait comme un objet .NET. Ceci est rendu possible grâce au wrapper RCW (Runtime Callable Wrapper) dont la fonction principale est de « marchaliser » les appels entre un client .NET et l’objet COM invoqué.

Mais nous sommes surement moins nombreux à avoir été confronté à la problématique inverse. A savoir, comment exposer un objet .NET à un composant COM existant.

La problématique est moins triviale car un composant COM développé en VB6 ou en C++ unmanaged n’est pas capable de dialoguer nativement avec une assembly .NET.  Il existe heureusement un Wrapper .NET qui permet d’exposer un objet .NET sous la forme d’un composant COM. C’est la fonction du CCW «COM Callable Wrapper ».

 Je ne vais pas dans ce ticket décrire toutes les étapes nécessaires pour réaliser cela, car il existe des liens, notamment sur MSDN qui le font très bien. Cf : http://msdn.microsoft.com/en-us/library/f07c8z1c(VS.71).aspx

Comme souvent, les exemples que l’on trouve nous montrent comment renvoyer une simple chaine de caractères ou un objet. Toutefois, lorsqu’il s’agit de passer une collection d’objets complexes définis en VB6 en paramètre d’une méthode d’une classe .NET ou de renvoyer une collection d’objets cela se complique un peu…

En fait, même si vous avez fait tout ce qu’il faut pour exposer une classe .NET en COM via CCW en décorant votre classe avec les attributs qui vont bien  [GUID()] [ComVible()] etc… et utilisé l’utilitaire Regasm.exe, vous arrivez bien à renvoyer un objet vers votre client COM mais pas une collection de cet objet.

Euh… un petit exemple peut être…

Voilà, je souhaite invoquer la méthode « GetUtilisateur » de  la classe .NET « ProxyUtilisateur  » d’une assembly « ClassProxyRefCOM » exposée en COM  pour qu’elle me renvoie un objet « MappingUtilisateur ».

En VB6, cela donne un truc du genre :

 
Dim oProxyService As ClassProxyRefCOM.ProxyUtilisateur
Dim oMappingUser As ClassProxyRefCOM.MappingUtilisateur
Set oProxyService = CreateObject("ClassProxyRefCOM.ProxyUtilisateur")
Set oMappingUser = oProxyService.GetUtilisateur(UserNT)

Pour se faire, il a fallu nous seulement décorer et exposer la classe ProxyUtilisateur, mais également la classe « MappingUtilisateur » pour qu’elle soit connue comme un objet COM.

En C#, cela donne un truc comme cela :

 

[Guid("3661703D-2BB9-46a2-8723-72B78B7E0390")]

[ComVisible(true)] 

public class MappingUtilisateur : ClassProxyRefCOM.IMappingUtilisateur 

{

     private string _prenom;

     private string _nom;

      private string _email;

        private string _profilNT; 

       public MappingUtilisateur()        {}

       public string Prenom   {    get { return _prenom; }    set { _prenom = value; }        }

       public string Nom        {    get { return _nom; }     set { _nom = value; }        }

        ……  

} 

Au passage, n’oubliez pas de cocher l’option « Register for COM Interop » dans les propriétés de votre projet .NET. Cette option fait la registration de la dll en COM dans la base des registres pour vous et crée le fichier tlb que vous pouvez ensuite utiliser dans Visual Studio 6 en référence de votre projet VB6. Enfin je ne vais pas vous refaire le cours…

Au final cela fonctionne correctement !!!

Toutefois imaginer maintenant que vous vouliez renvoyer une collection d’objet MappingUtilisateur, via une méthode GetListUtilisteurs(). Et bien vous ne pouvez pas exposer en COM une collection d’objets sans passer par une astuce. Celle-ci consiste à exposer un objet qui hérite d’une …. ArrayList .NET.

En C#, cela donne du code du style :

[Guid("F5113128-784F-4125-8AA4-A00F9762C73C")]

 [ComVisible(true)]

 public class MyCollectionCOM :ArrayList

 {

        public MyCollectionCOM() : base()        { }  

       public object GetByIndex(int idx)        return this[idx];   }

       public int NbElem()    {     return this.Count;     }

  }

De ce fait, vous pouvez déclarer un objet « MyCollectionCOM » en VB6 capable de recevoir votre collection de « MappingUtilisateur » :

Dim oProxyService As ClassProxyRefCOM.ProxyUtilisateur 
Set oProxyService = CreateObject("ClassProxyRefCOM.ProxyUtilisateur")
Dim arr As ClassProxyRefCOM.MyCollectionCOM
Set arr = oProxyService.GetListUtilisateurs()

Dans un prochain ticket, je parlerai du mécanisme de libération des objets CCW et .NET et du « profiler » de mémoire qui m’a permis de m’en assurer…

Laurent Nyffels

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Application de la sécurité sur la QuickLaunch SharePoint

clock August 5, 2009 04:38 by author ykalandyk

Bonjour à tous.

Tous les sharepointiennes et sharepointiens connaissent déjà la quickLauch (barre de menu sur la partie gauche de l'écran, par défaut).
Si on crée des listes et des bibliothèques de documents, SharePoint vous propose d'ajouter un lien dans ce menu.
En fonction des paramètres de sécurité appliqués sur cette liste ou bibliothèque de documents, ce lien peut disparaitre. C'est une fonctionnalité bien sympathique car on ne montre que ce que l'on peut accéder.

Cependant, vous voulez ajouter un lien dans ce menu qui va pointer sur un fichier ou sous dossier à l'intérieur d'une bibliothèque de documents. Dans ce cas précis, la sécurité ne s'applique plus, le lien reste visible même si l'utilisateur n'a pas les autorisations nécessaires pour accéder à ce fichier/dossier. Il n'est possible qu'à travers l'interface d'administration de SharePoint d'appliquer les droits relatifs aux liens de la QuickLaunch....et donc seulement sur les listes et les bibliothèques de documents.

En creusant un peu, on peut réussir à appliquer les droits sur vos liens personnalisés (à condition que cela pointe bien sûr sur un "item" sharepoint).
Voici la procédure à suivre (testé sur WSS3.0 et pas sur MOSS2007):

Avant de commencer, ce qui suit n'est certainement pas supporté par Microsoft

1/ Ouvrez SQL Management studio avec une connexion sur le serveur SQL de votre plateforme SQL
2/ Déroulez jusque votre base de contenu et ouvrez la table NavNodes

(vous pouvez trouver la decription de cette table en suivant ce lien :http://msdn.microsoft.com/en-us/library/dd585180(office.11).aspx )

pour l'exemple, nous allons modifier le comportement d'une entrée de cette table, dans la colonne Name, je vais choisir "Mes bogues"
on remarque que la colonne ElementType est à "1" (soit un lien), que la colonne DocId est "Null" (soit ce n'est pas un item appartenant à SharePoint), et que la colonne "URL" est correctement renseignée.

3/ Ouvrez une nouvelle fenêtre de requète dans SQL Management Studio et tappez ceci

Vous trouverez la description de la tables AllDocs la : http://msdn.microsoft.com/en-us/library/dd304112(PROT.13).aspx

On retrouve notre entrée "MyItems.aspx" issue de la colonne "Url" de la table "NavNodes".
On peut copier le GUID de la colonne "ID" de la table "AllDocs".

4/ Revenez sur la table "NavNodes" et coller le GUID dans la colonne "DocId".
Mettez à la valeur "Null" la colonne Url (en pressant simultanéemant sur Ctrl et 0).
Et saisissez la valeur "0" sur la colonne "ElementType".

A partir de là, nous en avons fini avec les tables SQL.

5/ Ouvrez sur votre site web SharePoint et  accédez à la page de gestion de la QuickLauch (Barre de liens rapides, en francais)

6/ Modifiez le lien correspondant à "Mes Bogues" et remarquez que l'adresse de ce lien est grisé.

7/ Appuyez joyeusement sur le bouton "OK" de cette page pour appliquer les dernières modifications de ce lien

cette dernière étape mériterait un peu plus d'explication, mais faute de temps, je n'ai pas creusé.

Si vous avez la même problématique avec la barre de navigation haute (Top Link Bar, in english), la méthode reste la même.

Le point délicat reste l'identification dans la table "AllDocs" de l'élément correspondant au lien de la table "NavNodes"

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Calendrier

<<  July 2010  >>
MoTuWeThFrSaSu
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
Afficher en pleine page

Visiteurs