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 :
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.
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!
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.
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.
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
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
).
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/
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
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.
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
.
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"
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
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 :-)
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 | |
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)
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.
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.
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.
Suite à mon précédent post sur stackalloc
http://blogs.developpeur.org/tkfe/archive/2006/11/03/Connaissez_2D00_vous-stackalloc-du-c_2300_-ou-le-localloc-de-l_2700_IL-_3F00_.aspx
, il faut bien se rendre à l'évidence, je vais devoir penser à la retraite ...
J'ai parlé des tableaux de 8600 octets environ, j'ai écrit une grosse ânerie, mesdames, messieurs! J'ai travaillé en septembre sur ce point et j'ai posté en utilisant ma mémoire (celle de mon cerveau
quasiment un mois et de demi après. Je m'explique :
byte[] tableau1 = new byte[84987];//-> gen 0
byte[] tableau2 = new byte[84988];//-> gen 2
MessageBox.Show(GC.GetGeneration(tableau1).ToString());
MessageBox.Show(GC.GetGeneration(tableau2).ToString());
Il faut donc multiplier par 10 ce que j'ai pu écrire.
Je suis un peu surpris par le fait que personne ne m'est fait la remarque mais bon, c'est bien vous êtes respectieux des vieux 
PS : les US sont aussi respectieux : http://forums.asp.net/thread/1427326.aspx 
Suite à une demande d'un de nos experts francophones en création de contrôles winform, pour des contrôles like Vista, j'ai ressorti des placards mes vieux codes (datant de fin 2001, début 2002, eh oui ça passe...) que je lui ai transmis.
Mais je n'étais pas satisfait de la performance des routines. Comme dernièrement, je réécris tout une série d'articles sur les images pour Tech Head Brothers, j'en ai profité pour intégrer les petites trouvailles que j'ai pu faire en étudiant quelques instructions IL.
J'ai découvert que de gros gains peuvent être obtenus avec les tableaux de moins de 8600 octets. Les tableaux que nous utilisons en général sont alloués sur le tas managé. Les tableaux de moins de 8600 octets se trouvent en génération 0. Ils sont donc soumis fréquemment au garbage collector, ce qui provoque un souci de performance. Les tableaux de plus de 8600 octets environ se trouvent en génération 2. Ils sont donc plus rarement soumis au garbage collector.
L'idée est donc de placer à un autre endroit de la mémoire les tableaux de moins de 8600 octets. L'instruction IL localloc permet de réserver de la mémoire dans la zone réservée à la méthode courante. C'est à dire que les données du tableau se trouvent très proches de la pile d'évaluation, d'où un gain évident de performance. De plus, cette zone mémoire n'est pas soumise aux actions du garbage collector. Cette mémoire n'existe que le temps de vie de la méthode : dès que l'instruction IL ret est rencontré, ces zones mémoires ne sont plus accessibles et donc libérées.
En c#, le mot clé, permettant de ne pas avoir à générer de l'IL, est stackalloc. Je l'emploie donc dès que j'ai un tableau de moins de 8600 octets environ qui est souvent appelé. Si vous voulez avoir une idée de la popularité de cette instruction avec la manipulation d'image, n'hésitez pas rechercher sous google ou live search ces mots clés : stackalloc BitmapData. 
Bref, j'ai remis au goût du jour mes filtres de convolutions.
Le principe est simple, on applique une matrice à chaque pixel de l'image.
Voici un exemple de matrice que l'on peut appliquer à chaque pixel d'une image
-1 | -2 | -1
-2 | 16 | -2
-1 | -2 | -1
afin de réhausser la netteté de l'image.
La valeur de chaque pixel voisin est multiplié par un coefficient. On additione le tout puis on divise la somme par un facteur qui est en général la somme des coefficients. A ce résultat, on peut choisir d'ajouter une valeur. Le résultat donne la nouvelle valeur du pixel.
Vous trouverez la source ici : http://www.csharpfr.com/code.aspx?ID=40198
Sachez que j'ai amélioré de près de 65% la performance de mon code ! Je pense que l'on peut encore gagner quelques cycles CPU en analysant le code natif produit.
Concernant l'emploi de stackalloc, faîtes très attention aux possibles débordements de pile! C'est pourquoi, je me fixe comme limite d'utiliser cette instruction que pour les tableaux qui seraient habituellement placés en génération 0 sur le tas, c'est à dire faisant moins de 8600 octets.
Pour ce qui est de mon dernier article ( http://www.techheadbrothers.com/Articles.aspx?Id=8d3eb481-8a98-42a6-8033-e851c797aa60&p=1 ), j'avais laissé un problème à résoudre concernant la performance. Vous avez maintenant un peu la solution avant l'heure:-)
Mon prochain article (en cours d'élaboration) abordera pleinement le sujet.
Update à lire absolument ici : http://blogs.developpeur.org/tkfe/archive/2006/11/10/a-propos-de-mon-post-sur-stackalloc.aspx
Il est toujours bon de resuivre régulièrement les bonnes pratiques en manière de sécurité. Et, on a beau se dire que l'on connaît déjà ce qu'il ne faut pas faire, il m'est arrivé de reparcourir mon code et de m'apercevoir que des parties étaient déficientes. Donc ce n'est jamais inutile d'être ressensibiliser régulièrement.
Ce webcast live sera animé le jeudi 2 novembre 2006 à 14h30 par Eric Mittelette et Eric Vernié.
Les inscriptions se font ici :
http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032313939&EventCategory=4&culture=fr-FR&CountryCode=FR
Suite à de nombreuses demandes et à un support important auprès des utilisateurs VB.NET, j'ai décidé d'écrire un article sur la manipulation des images en VB.NET. Ceci devrait me décharger des nombreux réponses (répétitives pour moi :-) que je dois faire plusieurs fois par semaine sur le sujet.
Dans le prochain article, nous irons un peu plus à la recherche de la performance et de la compréhension en "dessous" des VB.NET et C#.
Ce post est aussi l'occasion de vous dire que j'ai pu employer le nouvel outil de publication de Tech Head Brothers qui a fait peau neuve il y a quelques temps. Mon impression : super travail de Laurent et Mathieu Kempé !
Manipulation d'images c# et vb.net
Enfin, pour répondre à ceux qui me demandent pourquoi je ne publie pas plus d'articles, écrire un article demande beaucoup de temps. Et quand on essaie de le faire avec de la pédagogie, ça demande beaucoup d'efforts. Je n'ai pas ce don naturel de faire vite et bien :-)
ps : Toutes mes excuses auprès des personnes auxquelles je n'ai pas encore répondu...
ps2 : Plus de détails sur l'outil de publication ici : http://www.codeplex.com/Wiki/View.aspx?ProjectName=THBAuthoring
Je ne sais pas si vous avez rencontré ce genre de problème un jour mais celui-ci m'a fait perdre du temps et m'a aggacé ...
Mon développement était simple : un UserControl avec AutoScroll à true et des contrôles statiques et dynamiques. L'ajout important de contrôles provoquait bien l'apparition de la ScrollBar. L'ascenseur se trouvait alors sur les derniers contrôles alors que je voulais que le haut de mon UserControl soit visible. J'ai tout essayé (donner le focus à un contrôle se trouvent en haut, modifier l'AutoScrollPosition lors du Load, ...), ça ne changeait rien du tout. Ce n'est qu'après un long moment que j'ai eu l'idée d'essayer de modifier l'AutoScrollPosition dans l'événement Paint comme ceci :
bool
_load = false;
private void MonUserControl_Paint(object sender, PaintEventArgs e)
{
if (!_load){
this.AutoScrollPosition = System.Drawing.Point.Empty;
_load = true;}
}
ça fonctionne très bien, même si je trouve ça bizzaroïde
donc si ça peut servir à quelqu'un...
Les journées Microsoft de la sécurité ont eu lieu les 2 et 3 mars dernier. Si vous n'avez pas pu les suivre, ce qui fut mon cas, les voici disponibles sous forme de webcast. Cool !!!
http://www.microsoft.com/france/securite/jms/
Bonne visualisation, bons téléchargements !
Les 10 derniers blogs postés
-
SharePoint : Nouvel article sur la modification du lien de recherche de Team Sites MOSS par
Blog Technique de Romelard Fabrice le il y a 29 minutes
-
Power Tools 2008 CTP Juillet par
Noham Choulant le il y a 2 heures et 3 minutes
-
Disparition de variables de session PHP après une redirection ? par
MadMatt le il y a 12 heures et 0 minutes
-
[MOSS 2007] Publier ses formulaires InfoPath via feature par
Adrien Siffermann le il y a 15 heures et 7 minutes
-
Imagine Cup 2008 - Paris - Les résultats par
TheSaib .NET blog le il y a 16 heures et 29 minutes
-
L'Egypte accueille Imagine Cup 2009 par
Code is poetry le il y a 16 heures et 41 minutes
-
PowerShell : Mise en ligne de fonctions intéressantes pour SharePoint par
Blog Technique de Romelard Fabrice le il y a 17 heures et 48 minutes
-
Raccourcis clavier et CRM 4 par
Clark, C#, MSCRM, SBS le il y a 21 heures et 54 minutes
-
[Silverlight] Comment échanger des données entre une application Silverlight et une page ASP.NET via cookies ? par
Thomas Lebrun le il y a 22 heures et 30 minutes
-
SharePoint 2007 : Trouver les fichiers CheckOut dans une librairie de document par
Philippe Sentenac [MVP SharePoint] le 07-08-2008, 08:30