Pattern singleton thread safe en C# : c’est facile

Lu ici : http://www.dofactory.com/Patterns/PatternSingleton.aspx

Voici la manière classique d’écrire un pattern singleton thread-safe en C# :

class MySingleton
{
    private static MySingleton instance;

// Lock synchronization object
    private static object syncLock = new object();

private MySingleton() { DoSomething(); }

public static MySingleton Instance
    {
        get
        {
            // Support multithreaded applications
            // through 'Double checked locking'
            // pattern which (once the instance
            // exists) avoids locking each
            // time the method is invoked
            if (instance == null)
            {
                lock (syncLock)
                {
                    if (instance == null)
                        instance = new MySingleton();
                }
            }
            return instance;
        }
    }
}

Et maintenant, voici la manière “.NET” d’écrire ce même singleton :

class MySingleton
{
    // Static members are lazily initialized.
    // .NET guarantees thread safety for
    // static initialization
    private static readonly MySingleton instance =
                        new MySingleton();

// Constructor (private)
    private MySingleton() { DoSomething(); }

public static MySingleton Instance { get { return instance; } }
}

ça marche parce que “private static readonly” entraîne :

  • Initialisation paresseuse
  • Thread-safety garantie par .NET pour les initialisations statiques.

C’est pas beau ça ?

Advertisements

Comment accéder aux fichiers réels du GAC ?

Lu ici : (Using Explorer to get to physical files in the GAC http://weblogs.asp.net/jkey/archive/2003/02/25/3006.aspx), un truc idiot, mais qui marche remarquablement bien, pour voir les fichiers réels du GAC :

  • ouvrir une commande DOS, et taper subst G: %windir%\assembly
  • Si l’explorateur est ouvert, le fermer et le rouvrir, aller sur G:, et voilà, on a maintenant accès à la strucure physique du GAC !

Attention, il vaut mieux être sûr de son coup avant de faire joujou avec la structure interne du GAC…

Réparer Visual Studio 2005

Si vous avez installé Visual Studio 2005 Beta1, vous avez peut-être rencontré des problèmes dans la version finale (ou la Beta2). Plus précisément, l’IDE peut refuser de charger le “Common IDE Package” au démarrage, ou encore il peut refuser d’afficher le designer Windows Forms par exemple. Voici le genre de message que vous pouvez rencontrer :
Package Load Failure
Package 'Visual Studio Common IDE Package' has failed to load or properly ( GUID = {6E87CFAD-6C05-4ADF-9CD7-3B7943875B7C} ). Please contact package vendor for assistance. Application restart is recommended, due to possible environment corruption. Would you like to disable loading this package in the future? You may use 'devenv.exe /resetskippkgs' to re-enable package loading

Pour cette catégorie de problème, il existe le Visual Studio troubleshooting tool (gracieusement fourni par Aaron Stebner) qui peut être utilisé pour nettoyer toutes les vieilleries laissées sur votre disque dur par la Beta1 de Visual Studio, et ainsi rendre Visual Studio .NET 2005 pleinement opérationnel.
NB : cet outil devrait aussi fonctionner pour les versions Express de Visual Studio
Cet outil peut être téléchargé ici : http://astebner.sts.winisp.net/Tools/ttool.zip

Et l’article l’accompagnant : http://blogs.msdn.com/astebner/archive/2005/11/09/491118.aspx

[English version of the post]

Repairing Visual Studio .NET 2005

If you had installed Visual Studio .NET 2005 Beta1, you may run into problems using the final release (or the Beta2). More specifically, the IDE may refuse to load the “Common IDE Package” at startup, or it may be unable to show up the Windows Forms designer for instance. Some messages you may encounter may resemble this one:

Package Load Failure
Package 'Visual Studio Common IDE Package' has failed to load or properly ( GUID = {6E87CFAD-6C05-4ADF-9CD7-3B7943875B7C} ). Please contact package vendor for assistance. Application restart is recommended, due to possible environment corruption. Would you like to disable loading this package in the future? You may use 'devenv.exe /resetskippkgs' to re-enable package loading

For this category of problems, there exists the Visual Studio troubleshooting tool (gracefully provided by Aaron Stebner) which can be used to clean all the old stuff that was left on your hard drive by Beta1 release of Visual Studio and thus fully enables Visual Studio .NET 2005.
NB : this tool should also work if you encounter problems with an Express edition of Visual Studio
The tool is available for download here: http://astebner.sts.winisp.net/Tools/ttool.zip

And the article accompanying it: http://blogs.msdn.com/astebner/archive/2005/11/09/491118.aspx

[Version française]

Docking à la Visual Studio 2005

La librairie de docking de Weifen Luo a été mise à jour récemment pour supporter .NET 2 et Visual Studio 2005. On a ainsi droit à du docking très proche de ce que fait Visual Studio 2005 (c’est à dire avec les icônes de placement des fenêtres). De plus, le nouveau contrôle de menu (MenuStrip) est supporté (utile pour effectuer un merge du menu d’une fenêtre MDI fille avec le menu de son parent).

On peut télécharger cette librairie sur sourceforge : http://sourceforge.net/projects/dockpanelsuite/

Intéressant aussi (même s’il couvre une version précédente), l’article qu’il a écrit sur The CodeProject : http://www.codeproject.com/cs/miscctrl/DockManager.asp

PS : afin d’être encore plus proche du look’n’feel Visual Studio 2005, je propose un petit patch, dans le constructeur de la classe DockOutline, remplacer la couleur utilisée par DragForm.BackColor par Color.FromArgb(96, 128, 186)

NDoc 1.3 Beta2

La version 1.3 (encore en beta) de NDoc apporte une nouveauté étendant les possibilités de documentation à l’infini : il s’agit de l’utilisation de balises personnalisées. En effet, il suffit de fournir le morceau de XSLT correspondant aux balises personnalisées pour quelles soient reconnues par NDoc. Auparavent, le seul moyen de réaliser ceci était de créer un documenteur personnalisé basé sur (dérivant) d’un des documenteurs existants…
Voir la page de documentation http://ndoc.sourceforge.net/content/extensibility.htm