Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Tkfé

.Net passionnément, tout simplement

Actualités


  • Frédéric Mélantois
    A part boire du café ou du thé à longueur de journées, il m'arrive de coder ;-)
    Petite citation :
    Je n'éblouis pas mon entourage, je le fais rayonner. F.M. @1986
Recherche un passionné .NET
Je suis à la recherche d’un développeur .NET maîtrisant MVC 4, les problématiques Web ainsi que les Winforms. Le candidat doit être obligatoirement autonome et opérationnel.

Il travaillera pour un courtier en assurance-vie au sein d’une petite équipe bénéficiant d’une forte initiative où il pourra pleinement exprimer son talent.

Ce poste peut être ouvert aux jeunes diplômés, quel que soit le diplôme, à condition que ceux-ci soient de véritables passionnés, déjà ouverts aux problématiques professionnelles. Sachez que nous jugerons en premier lieu les compétences techniques, le savoir-faire avant la bonne présentation, le potentiel. Autant vous prévenir, pour éviter les malentendus, et afin que chaque partie ne perde pas un temps précieux, le candidat sera soumis à un test technique d’un bon niveau. Autant dire, qu’il ne suffira pas d’être audacieux.

Le poste est à pourvoir dès maintenant à Boulogne-Billancourt.

Me contacter (car le lien contact de cette page ne fonctionne plus) : fmelantois chez free
Liste d'une grande partie de mes articles techniques
Voici la liste d'une grande partie de mes articles techniques autour de .NET :
Y serez-vous ?

J-8 avant l'événement de l'année ! Il s'agit bien sûr des Microsoft TechDays 2009. Pour les plus (ou les moins ? Smile ) autistes d'entre vous, pour ceux qui n'auraient pas eu connaissance du plus grand événement Microsoft du continent européen, il est toujours temps de vous y inscrire !

Vous trouverez toutes les précisions sur les
TechDays 2009 ici . Notez bien que l'inscription est gratuite.

Vous y trouverez de nombreux stands, dont les stands communautaires. Notez-bien que vous y retrouverez entre autres, le stand habituel de CodeS-SourceS.

Plus de précisions : http://techdays.codes-sources.com/ 

Au plaisir de vous voir aux TechDays !!

 

 

 

WPF : Effets et pixel shaders

Bonjour,

Je viens d'achever un nouvel article concernant une nouveauté du SP1 du Framework 3.5. Cela concerne les effets sur les images, plus généralement les effets sur tout les éléments dérivant de "UIElement". Utilisateurs des effets fournis avec les précédents Framework 3.0 ou 3.5, vous avez sans doute abandonné l'usage des "BitmapEffect" étant donnés les problèmes de performance.
L'équipe WPF a pris en compte les reproches des développeurs en proposant un nouveau modèle pour la conception d'effets sous WPF. Ce modèle s'appuie sur les pixel shaders de DirectX, ces mini-programmes s'éxécutant sur la carte graphique. Les performances n'ont plus rien à voir avec celles des "BitmapEffect" car cette fois-ci, la configuration matérielle est prise en compte.

Je vous propose une initiation à ce nouveau modèle de conception d'effets :

http://www.techheadbrothers.com/Articles.aspx/wpf-effets-pixel-shaders

Etant données les notions abordées diverses, il s'agit d'un de mes articles qui m'a donné le plus difficulté concernant la pédagogie. J'espère être parvenu à faciliter la compréhension de la mise en oeuvre d'effets sur les visuels WPF avec les pixel shaders. Notez qu'il existe quelques articles en langue anglaise sur le sujet. Je reprends évidemment les notions déjà abordées par ceux-ci mais vous trouverez des explications supplémentaires inédites, par exemple, sur le mode d'échantillonage, sur le compilateur de shaders, deux effets inédits (correction d'exposition, Laplacien) ainsi que la prise en compte des pixels voisins (filtrage). Dans les prochains jours, je devrais mettre en ligne quelques codes d'effets sur le réseau CodeS-SourceS.

Vous pouvez retrouvez mes précédents articles : ici

Merci à Thomas pour sa relecture. N'hésitez pas à lire son livre très pédagogique WPF par la pratique pour vous initier ou revoir les fondamentaux de WPF. Le livre d'Olivier : WPF Développez des applications riches sous Windows qui a des qualités indéniables conviendra peut-être plus aux déjà initiés.

Posted: lundi 12 janvier 2009 12:23 par tkfe | 0 commentaire(s)
Classé sous :
WPF : Les transformations et les calculs matriciels

Bonjour,

Je viens d'achever la rédaction d'un article sur WPF. J'ai longtemps mis de côté cette technologie car je n'ai pas cru au succès de celle-ci. Il faut dire qu'Eric Mittelette a fini par me convaincre qu'il fallait s'y investir. Il y a en effet bien de la place pour le développeur avec ce Framework dédié à la présentation !

Il faut savoir reconnaître ses erreurs, aussi je vous propose un premier article consacré aux transformations et animations. Des bases XAML pour gérer transformations et animations, un bref rappel théorique de mathématiques vous permettra de comprendre la mécanique sous-jaccente du Framework. Cette compréhension vous amènera à réaliser quelques petites optimisations sur vos animations d'objets afin d'améliorer la performance.

WPF : Les transformations et les calculs matriciels

Mes prochains articles devraient être très largement consacrés à WPF.

Merci à Guillaume, Laurent, Thomas et Matthieu pour leur relecture. Wink

Support technique gratuit sur le SP1 de Windows Vista !

Vous lisez bien !

Microsoft met en place un support gratuit, illimité, concernant l’installation et la compatibilité de Windows Vista SP1 pour tous les clients de part le monde jusqu’au 18 mars 2009. Un support téléphonique a été mis en place mondialement. Un support par chat et par email est également disponible pour la France, la Belgique et la Suisse.

Dès maintenant, vous pouvez vous rendre sur la page suivante pour trouver plus d’informations quant aux services proposés :

 http://support.microsoft.com/common/international.aspx?rdpath=1&prid=11274&gprid=500921

Un nouveau MVP c#

Après avoir été trois années Microsoft MVP ASP.NET, me voici MVP C#. Ma future réorientation professionnelle devrait me permettre de revenir beaucoup plus sur l'aspect technique que métier. Vous devriez donc voir beaucoup plus d'articles cette année.

A 39 ans, je me sens encore jeune (la passion et le sport, ça conserve). Je compte devenir raisonnable en dormant un peu plus que mes 4h30 - 5h par nuit mais occuper mon temps plus efficacement. Exit ceux qui me font perdre mon temps !

Une mention spéciale à Christophe Duhamel, Directeur Général de Marmiton.org qui me permettait, il y a un peu moins de dix ans, de devenir informaticien, après avoir été géologue puis agent de sécurité pendant près de 4 ans. Mille mercis à lui d'avoir fait confiance à un autodidacte !

Merci à l'ensemble des communautaires de partager aussi gratuitement leur passion !

Voici ci-dessous, à ce jour, la liste des articles que j'ai pu écrire :

c# 3.0 : Surcharger une méthode d'extension (suite)

Après mon article Comprendre les bases de Linq to Objets et un post " c# 3.0 : Surcharger les méthodes d'extension ", je me suis décidé à écrire un mini-article sur les surcharges.

http://www.techheadbrothers.com/Astuces.aspx/surcharger-methode-extension 

Vous y découvrirez en particulier une astuce possible pour éviter d'effectuer un nouvel accès à la base de données via une requête Linq en couche de représentation sur une référence issue de la DAL pour laquelle on a employé Linq to SQL.

internal static class ExtensionLinq

{

    internal static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source,

   Func<TSource, TResult> selector)

    {

        IEnumerable<TSource> sourceEnum = source;

        foreach (TSource s in sourceEnum)

            yield return selector.Invoke(s);

    }

}

En C# 3.0, l'emploi des méthodes d'extension demandent de la discipline.
Il en est de même avec l'emploi du mot clé "var".

UPDATE DU POST
La ligne en rouge dans le code ne sert à rien. Voir les commentaires pertinents de Flavien Charlon ci-dessous. Bravo pour avoir vu cela ! Il nous reste à comprendre la logique du compilateur c# 3.0 avec Linq To SQL lorsque que j'effectue la surcharge de la méthode d'extension Select.

[Article] Comprendre les bases de Linq To Objects

L'article est enfin publié ! Il a dû être remanié une quinzaine de fois pour des raisons purement pédagogiques. C'est donc une version épurée que vous trouverez sur le site Tech Head Brothers :

http://www.techheadbrothers.com/Articles.aspx/comprendre-bases-linq-to-objects

Il est destiné aussi bien aux débutants qu'aux initiés. J'espère l'avoir rendu accessible au plus grand nombre! Un grand merci à Cyril Durand, Thomas Lebrun, Matthieu Mezil, Laurent Kempé, Fabrice Romelard, Gaël Covain pour leurs différentes relectures.

Le chapitre sur les méthodes d'extension a été allégé. Je consacrerai bientôt quelques pages sur les "surcharges" de méthodes d'extension. Faut-il parler des éventuels soucis pouvant intervenir ? Les avis sont assez partagés dans la Communauté. Pour ma part, je fais partie des personnes qui pensent qu'informer, c'est prévenir et peut-être "éduquer" (sans prétention).

ps : je profite de ce billet pour inviter à la patience par rapports aux mails auxquels je n'ai pas encore répondu!

c# 3.0 : "Surcharger" une extension de méthode

Avant tout, je n'aime pas le terme de "surcharge" mais je n'ai pas trouvé un autre terme parlant.

Imaginez que vous souhaitiez utiliser le select de Linq mais en même temps, vous voulez rajouter un morceau de code (log, etc...) lors de l'appel à cet méthode. Ceci est possible en définissant la méthode d'extension suivante :

public static class ComplementEnumerable
    {
        public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
        {

            .... Ajout de code perso
            foreach (TSource s in source)

                yield return selector.Invoke(s);
        }
}

Lorsque vous réaliserez une requête Linq, celle-ci utilisera cette "surcharge" à condition que cette dernière soit dans la même assembly et le même namespace. Si ce n'est pas le cas, le compilateur vous préviendra d'un appel ambigu et ne compilera pas.
Si vous faîtes du développement en couches, vous avez donc plusieurs assembly, vous risquez alors d'être confronté à cet "appel ambigu de méthodes" (celle de Linq et votre "surcharge"). Pour contourner, ce problème, je recommanderai de mettre en "internal" au lieu de "public" la "surcharge" de l'extension de méthodes.

Vous en saurez beaucoup plus dans mon prochain article consacré à Linq to Objets : un mini-linq en c# 2.0, ... qui tarde à être publié :-)

ps : Un petit coucou à Cyril Durand pour le remercier de son esprit critique sur l'article.

Un article sur c# 3.0 Beta

Je viens de publier un article sur quelques éléments du langage c# 3.0 Un autre article fera suite. Je vous en conseille vivement la lecture pour avoir une idée des améliorations syntaxiques de c# 3.0 et afin de connaître les limites d'utilisation (notamment pour les structures) en contexte exigeant de performance.

Je souhaite vivement remercier Cyril Durand, Mitsu Futura, Fabrice Romelard et Laurent Kempé pour la relecture de cet article. Ils ont apporté leurs conseils et avis afin que la présente version soit vraiment plus pédagogique et plus développée que la version initiale.

Vous pouvez apporter votre avis, vos commentaires ou des améliorations sur les explications à travers une des nouvelles fonctionnalités proposée par Tech Head Brothers : la possibilité d'ajouter des commentaires aux articles.

c# 3.0 : Initialisation simplifiée de structure

Il est possible d'initialiser de manière plus simplifiée une structure avec c# 3.0.

Avant, nous faisions :

public struct MaStructure

{

    public int ValeurA;

    public byte ValeurB;

    public int ValeurC;

}

 

static void Main(string[] args)

{

    MaStructure a = new MaStructure();

    a.ValeurA = 256;

    a.ValeurB = 255;

    a.ValeurC = 45;

 

    Console.WriteLine(a.ValeurA.ToString());

    Console.ReadLine();

}


Désormais il est possible d'écrire :

 

      public struct MaStructure

       {

           public int ValeurA;

           public byte ValeurB;

           public int ValeurC;

       }

 

       static void Main(string[] args)

       {

           var a = new MaStructure {ValeurA=256,ValeurB=255,ValeurC=45};

           Console.WriteLine(a.ValeurA.ToString());

           Console.ReadLine();

       }


Vraiment pratique ! Mais n''hésitez pas à compiler et à ouvrir votre utilitaire préféré Reflector. Que nous dit-il ?

private static void Main(string[] args)

{

    MaStructure <>g__initLocal1 = new MaStructure();

    <>g__initLocal1.ValeurA = 0x100;

    <>g__initLocal1.ValeurB = 0xff;

    <>g__initLocal1.ValeurC = 0x2d;

    Console.WriteLine(<>g__initLocal1.ValeurA.ToString());

    Console.ReadLine();

}


Et là, on se dit, c'est parfait c'est ce que je souhaitais (une seule variable locale). Mais si vous allez un peu plus loin en regardant le code IL toujours sous Reflector ou à travers le désassembleur ILDASM, l'analyse fera apparaître trois variables locales

 

... pas gentil le Reflector !

Bref, si vous voulez en savoir plus, je sors très prochainement sur Tech Head Brothers un article intitulé
C# 3.0 Beta, déclarations et initialisations simplifiées, regardons sous le capot !

En attendant, l'excellent Kader Yildirim nous présente une série d'articles sur Linq :
Linq à 360 degrés

Posted: jeudi 7 juin 2007 12:13 par tkfe | 0 commentaire(s)
Classé sous : ,
Bill Gates s'invite dans "Pour la science"

Dans la revue Pour La Science de Juin 2007, version française du magazine américain "Scientific American", Bill Gates signe un article sur la Robotique intitulé "Un robot dans chaque foyer" (initialement publié en janvier 2007 dans Scientific American). Si vous voulez avoir le point de vue de Bill, rendez-vous dans les kiosques prochainement (les abonnés étant servis avant Stick out tongue).

C'est l'occasion de rappeler que Microsoft consacre des recherches dans ce domaine et fournie une boîte à outils de développement appelé Microsoft Robotics Studio :

http://msdn2.microsoft.com/robotics/ 

[Tech Head Brothers] Participez à l'amélioration !

Il est très agréable pour nous, auteurs d'articles, de recevoir des félicitations et encouragements de lecteurs. Mais, quand un lecteur vous écrit pour vous suggérer une amélioration, l'enthousiasme s'en trouve multiplié. Il y un peu plus d'un mois, Jean-Charles Meyrignac me contactait pour me proposer deux améliorations à mon article sur la manipulation d'images et la performance. Sachant que Laurent Kempé travaillait activement sur le site Tech Head Brothers à la possibilité d'offrir aux lecteurs d'intérargir avec les auteurs et autres lecteurs autour d'un article, j'ai décidé d'attendre cette évolution majeure du site pour communiquer mon enthousiasme sur les améliorations proposées par Jean-Charles.

Jean-Charles Meyrignac a participé au développement de nombreux jeux entre 1983 et 2004. Il est le webmaster du site http://euler.free.fr (site sur le calcul distribué de sommes de puissances).

Comme lui, n'hésitez à communiquer vos trouvailles ! Toutes les précisions sont fournies par Laurent Kempé (Expert et MVP) ici : http://www.techheadbrothers.com/Informations.aspx?id=15422610-4d9c-4819-b1cd-fa8501ea1574 
Encore merci Laurent pour offrir à nos lecteurs la parole !

Quant aux améliorations de Jean-Charles, je les ai rapporté dans la partie commentaire de mon article : http://www.techheadbrothers.com/Articles.aspx?Id=effdc4a7-6a38-4070-828a-ff472b8cab86 

Windows Vista Web Café

Une annonce de l'équipe Windows à vous relayer concernant Windows Vista :

Vous projetez de passer à Windows Vista et souhaitez connaitre les bonnes étapes à suivre avant de l’installer ? Vous recherchez des réponses concrètes sur la compatibilité de vos applications et matériels ou périphériques ? Vous aimeriez connaître les derniers trucs et astuces pour réussir simplement la migration depuis une version antérieure de Windows ?

Rejoignez nous sur le Windows Vista Web Café pour partager votre expérience et trouver votre chemin dans l’ensemble des ressources à votre disposition.

Ce nouveau Web Café est à la fois un lieu d’échange et un carrefour d’information sur la plupart des questions liées à cette nouvelle plateforme. Qu’il s’agisse de questions relatives aux pilotes matériels, à la compatibilité logicielle, aux trucs et astuces ou à tout autre sujet, vous y retrouvez en quelques secondes le lien, la ressource ou l’information vous permettant de mener à bien votre migration vers Windows Vista.

Le Windows Vista Web Café est également un excellent moyen de découvrir les sites communautaires réunissant les discussions à thèmes autour de Windows Vista. Le conseiller Hervé quant à lui est à votre disposition pour échanger en direct par chat avec vous et vous guider sur les liens complémentaires relatifs au sujet qui vous intéresse.  

Alors n’attendez plus, rejoignez nous à l’adresse suivante : www.windowsvistacafe.com   

Dans l’attente de vous retrouver en ligne sur notre site, l’équipe Windows vous souhaite une excellente journée.

L’équipe Windows.

 

Posted: mercredi 2 mai 2007 15:34 par tkfe | 1 commentaire(s)
Classé sous :
[Orcas Beta 1] ADO.NET EDM wizard

Pour ceux qui ont téléchargé la beta 1, vous avez noté que le designer EDM (Entity Data Model) ne fonctionnait pas. Sur la CTP précédente, c'était seulement le cas pour ceux qui avaient VS 2005 sur leur machine, c'est à dire pas mal de monde Stick out tongue.

Vous avez bien évidemment EDMGen.exe en ligne de commande pour générer vos fichiers CSDL et cie mais il faut avouer que ce n'est pas très confortable pour les "Visual Developers" Big Smile que nous sommes.

Microsoft vient de nous livrer un upgrade pour résoudre le problème :

http://www.microsoft.com/downloads/details.aspx?FamilyID=f69e9eb8-0ebd-4fba-a4cc-2050297ba75b&displaylang=en 

TechDays 2007 : J - 4

Je serais présent aux TechDays 2007. Vous trouverez ci-dessous mon agenda pour ceux qui souhaiteraient me rencontrer. Hors sessions, vous me retrouverez auprès des stands communautaires (CodeS-Sources, Tech Head Brothers, Dotnet-tech) ou devant le distributeur de kawa :-)

09:30
10:30
Plénière Développeurs
11:00
12:00
Linq, DLinq, Xlinq: présentation générale
13:00
14:00
Preview d'Orcas, la prochaine version de Visual Studio
14:30
15:30
Architecture Web : DLINQ en tant que couche d'accès aux données
16:00
17:00
Linq, DLinq, Xlinq: fonctionnement et architecture
17:30
18:30
La gamme Expression


09:30
10:30
Plénière toutes audiences techniques
11:00
12:00
Windows Presentation Foundation : le moteur de rendu
13:00
14:00
Evolution de T-SQL avec SQL 2005
La sécurité dans SQL Server 2005
14:30
15:30
La 3D dans Windows Presentation Foundation
16:00
17:00
Reporting avec Reporting Services
Etendre ASP.NET 2.0 avec les custom providers
17:30
18:30
Datamining avec SQL Server 2005

Concernant les soirées (après 18h30), ma disponibilité ne sera pas totale puisque je prendrai le dernier train pour Orléans.

ps : à défaut de répondre à vos questions, je pourrai vous signer un autographe :-)

ps2 : Notez bien, sinon vous allez jouer au chat et la souris (Souris de CodeS-SourceS évidemment)

ReportViewer / Report : Chargement d'un rapport contenu dans une autre Assembly

Namespace : Microsoft.Reporting.WinForms

Si vous avez créé des rapports dans un projet winform et que vous souhaitez réutiliser ce rapport pour d'autres applications, il devient intéressant de mettre en ressources le ou les rapports dans une assembly à part.

Le chargement du rapport se fait comme suit :

 string assemblyFile = "Rapports.dll";

 _assemblyForReports = Assembly.LoadFrom(assemblyFile);

//Chargement du rapport contenu comme ressource dans Rapports.dll              report.LoadReportDefinition(_assemblyForReports.GetManifestResourceStream("Rapports.ReportCommissions.rdlc"));

Mettre les try/catch qui vont bien ;-)
ça paraît tout bête mais comme on ne fait pas des rapports tous les jours, cela peut vous éviter de chercher.

Copier des blocs de mémoire en c# et VB.NET (suite)

Après avoir fabriqué un MemCpy pour c# ou VB.NET (ou delphi.NET, ...) (voir ce post), on vient de me poser une question.

Conformément aux recommandations exposées sur ce post (tableau donc la taille est de moins de 85ko environ), en adressant mon tableau le plus tardivement dans ma méthode via l'instruction c# stackalloc, puis-je faire une copie par bloc ? La réponse est oui :

        public static void TestCopyStackalloc(Bitmap source)
  {
   int width = source.Width;
   int height = source.Height;

   BitmapData bmpData = source.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

   unsafe
   {
    int* tab = stackalloc int[100];

    Memoire.Memory.MemCpy((int)(tab), bmpData.Scan0.ToInt32(), 100 * 4);

    MessageBox.Show("99ème valeur dans l'image : " + ((int*)(bmpData.Scan0))[99].ToString());
    MessageBox.Show("99ème valeur dans tab : " + tab[99].ToString());
   }

   source.UnlockBits(bmpData);
  }

Une autre question que l'on ne m'a pas encore posé, mais ça va pas tarder... Puis-je copier des blocs de tableaux managés de type valeur. La réponse est aussi oui d'après mes premiers tests. Mais je ne vais pas pour l'instant trop détailler cette partie car je n'ai pas encore suffisament étudié le comportement du garbage collector (je pense en particulier au comportement des objets "punaisés" ou pinned in english, faut-il pinned ou pas ?), bref je me pose encore plein de questions :-)

Voici toutefois le code IL de la méthode qui pourrait aller bien :

.method public hidebysig static void Copy(int32[] destination, int32[] source, int32 nboctet) cil managed
{
      .maxstack 3
     
      ldarg.0
      ldc.i4.0
      ldelema int32
      ldarg.1
      ldc.i4.0
      ldelema int32
      ldarg.2
      cpblk
      ret
}

Donc à rajouter dans votre dll, si vous voulez m'aider à tester.

Copier des blocs de mémoire en c# et VB.NET

Comment faîtes-vous actuellement ? Il y a de fortes chances que vous utilisiez le Marshal.copy pour la mémoire non-managée. Vous utilisez peut-être une dll via l'interop

C'est en étudiant le langage IL (intermediate language) que je me suis aperçu qu'une instruction IL permettait de le faire : cpblk

L'idée de me faire une petite dll pour me permettre de réaliser des copies rapides de blocs sous c# ou Vb.net m'est vite venu. Démonstration rapide :

Copiez le code suivant dans notepad :

.assembly extern mscorlib
{
  .ver 2:0:0:0
}

.assembly Memoire
{
  .ver 1:0:0:0
}
.module Memoire.dll


.class public abstract auto ansi sealed beforefieldinit Memoire.Memory
       extends [mscorlib]System.Object
{
  .method public hidebysig static void  MemCpy(int32 destination,
                                             int32 source,
                                             int32 nboctet) cil managed
  {
    .maxstack  3
    ldarg.0
    ldarg.1
    ldarg.2
    cpblk
    ret
  }

  .method public hidebysig static void  MemCpy(native int destination,
                                             native int source,
                                             int32 nboctet) cil managed
  {
    .maxstack  3
    ldarg.0
    ldarg.1
    ldarg.2
    cpblk
    ret
  }
}

A noter que j'ai laissé les noms comme destination, source et nboctet afin qu'il puisse apparaître dans l'éditeur visual studio après le référencement de la dll. Ces noms d'argument ne sont pas obligatoires en IL. De même l'instruction hidebysig ne sert à rien, si ce n'est pour préciser à c# ou vb.net que la méthode
possède une autre signature semblable.
ldarg.0, ldarg1, ldarg2 sont des instructions permettant de déposer les arguments de la méthode sur la pile.
L'instruction cpblk s'excute à partir des valeurs de la pile. A noter que celle-ci est classé comme invérifiable, c'est à dire que cela correspond au contexte unsafe du c#. Ce qui correspond au SkipVerification des permissions .NET

Sauvegardez le code IL sous Memoire.IL
ouvrez une invite DOS et tappez : ILASM Memoire.il /dll

N'hésitez pas à regardez les options de ilasm /?

Memoire.dll a été généré. Il vous suffit maintenant d'ajouter comme référence dans votre projet c# ou VB.NET.

Effectuons un test pour voir si ceci est concluant :

        public static void CopyGDI(Bitmap destination, Bitmap source)
        {
            Graphics g = Graphics.FromImage(destination);
            g.DrawImage(source, 0, 0, source.Width, source.Height);
            g.Dispose();
        }

        public static void CopyPointer(Bitmap destination, Bitmap source)
        {
            int width = source.Width;
            int height = source.Height;

            unsafe
            {

                BitmapData bmpData = source.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

                BitmapData bmpDataMirror = destination.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

                //image source
                int* newPixel = (int*)(void*)bmpData.Scan0;
                //image destination
                int* mPixel = (int*)(void*)bmpDataMirror.Scan0;
               
                for (int y = 0; y < height; y++)
                {
                    //on copie ligne à ligne comme doit le faire sans doute le DrawImage 
                    Memoire.Memory.MemCpy((int)mPixel, (int)newPixel, width * 4);

                    newPixel += width;
                    mPixel += width;
                }
                source.UnlockBits(bmpData);
                destination.UnlockBits(bmpDataMirror);
            }

        }

  public static void CopyIntPtr(Bitmap destination, Bitmap source)
  {
   int width = source.Width;
   int height = source.Height;

   BitmapData bmpData = source.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

   BitmapData bmpDataMirror = destination.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

   
            Memoire.Memory.MemCpy(bmpDataMirror.Scan0, bmpData.Scan0, width * height * 4);

   source.UnlockBits(bmpData);
   destination.UnlockBits(bmpDataMirror);

  }


Résultat des tests : les méthodes copyIntPtr et copyPointer, une fois la première initialisation faîte, sont 6 à 7 fois plus rapide que la méthode CopyGDI.

Je vous détaillerai bientôt sous forme d'un article ce que je viens de vous présenter succintement dans ce post. J'espère que ceux qui recherchaient un peu plus de performance en c# et vb.net, trouveront ici leur bonheur.

ps : l'exemple ci-dessus n'est peut-être pas le plus adapté pour la pédagogie mais je n'ai pas résisté à vous présenter cette perspective.

ps2 : Si vous faîtes un coup de reflector sur la dll, il vous mettra Memcpy aussi bien en c# qu'en VB.NET car il n'a pas d'équivalent pour le c# ou le VB.NET. En fait, il s'agit d'une instruction de c++.

ps3 : Ce post est un peu brute, je vous le présenterai mieux dans un prochain article.

Plus de Messages Page suivante »


Les 10 derniers blogs postés

- SharePoint 2013: Préparation de la migration - Création des site Templates dans 2010 et 2013 par Blog Technique de Romelard Fabrice le il y a 17 heures et 30 minutes

- [ #Yammer ] How to change interface language ? Comment changer la langue de l’interface ? par Le blog de Patrick [MVP SharePoint] le il y a 19 heures et 40 minutes

- Onedrive Sync Engine Host : CPU à 100% par Le petit blog de Pierre / Pierre's little blog le 08-06-2014, 22:22

- SharePoint : Bug sur la gestion des permissions et la synchronisation Office par Blog Technique de Romelard Fabrice le 07-10-2014, 11:35

- SharePoint 2007 : La gestion des permissions pour les Workflows par Blog Technique de Romelard Fabrice le 07-08-2014, 11:27

- TypeMock: mock everything! par Fathi Bellahcene le 07-07-2014, 17:06

- Coding is like Read par Aurélien GALTIER le 07-01-2014, 15:30

- Mes vidéos autour des nouveautés VS 2013 par Fathi Bellahcene le 06-30-2014, 20:52

- Recherche un passionné .NET par Tkfé le 06-16-2014, 12:22

- [CodePlex] Projet KISS Workflow Foundation lancé par Blog de Jérémy Jeanson le 06-08-2014, 22:25