C#

9 articles

Les liens pour bien démarrer avec Unity3D (Universal Apps)

unity3d

Cet article recense les différents liens qui m’ont été très utiles pour la création d’un jeu 2D avec Unity3D.

Le jeu en question s’appelle 4×3 disponible en Universal Apps sur Windows 8.1 et Windows Phone 8.1.

Unity3D

Unity et Windows 8.1, Windows Phone 8.1 et les universal Apps

Il est essentiel d’installer la version au moins égale à la 4.5.3. Seule cette version supporte les Universal Apps (apps pour Windows Phone et Windows 8.1).

Allez donc directement sur le site. Si vous avez déjà une version installée, ne vous fiez pas trop à la vérification automatique des mises à jour qui ne vérifient que les versions mineures (pour ma part).

Le lien pour télécharger la version est ici (> 1Go !) :

http://unity3d.com/unity/download

Unity et Visual Studio

Pour utiliser visual Studio à la place de MonoDevelop (livré en standard dans le package Unity), il existe un plugin (ex: SyntaxTree) racheté très récemment et offert gracieusement par Microsoft.

http://blogs.msdn.com/b/visualstudio/archive/2014/07/29/visual-studio-tools-for-unity-1-9.aspx

Le plugin existe sur les 3 dernières versions de Visual Studio 2010, 2012 et 2013. Il vous permet de manipuler le c#, débugger votre projet depuis Visual Studio. De quoi être très productif.

Poursuivre la lecture

Icones Segoe UI Symbol et C#

 

Les icônes Segoe UI Symbol

Microsoft depuis Windows 8 recommande d’utiliser des icônes provenant d’une police de caractères « Segoe UI Symbol ».

C’est très pratique, il suffit de choisir cette fonte et de connaître ensuite le code pour directement accéder à l’image vectorielle de très bonne qualité, et personnalisable avec de la couleur.

Certains caractères ont une largeur nulle permettant également de faire un contour d’une autre couleur ou encore de créer un cercle autour de l’cône.

Les palettes d’icônes Segoe UI Symbol sont consultables sur différents sites :

exemple :

 

SgoeUiSymbol

 

C’est assez simple, dans une application XAML, il suffit de codifier le caractère avec les tags XML standards.

Poursuivre la lecture

Requêtes HTTP lentes dans .NET

Dans un contexte d’une étude sur les performances d’une application web, j’ai remarqué des retards constants d’environ 200ms sur certains appels HTTP qui utilisaient une API externe.

L’application web et l’API étaient sur le même segment de réseau et donc la latence du réseau était hors de question.
De plus la cible API a précédemment fait l’objet de tests de charge jMeter et éprouvée pour gérer 1500req/s.

Ce qui était encore plus étrange dans cette situation, c’est que seules les requêtes POST présentaient ce retard de 200ms. Les requêtes GET étaient rapides comme prévu.

Poursuivre la lecture

Comment convertir en C# un XHTML en PDF

Dans cet article, je vais illustrer comment vous pouvez convertir une page XHTML en PDF à l’aide de la bibliothèque de flying-saucer . Il s’agit d’une librairie Java et nous devons donc la convertir vers une assemblie .NET.

Je vais utiliser le compilateur Bytecode IKVM.NET (ikvmc.exe) à cet effet. Alors allez-y et téléchargez la bibliothèque flying-saucer et le projet IKVM.

Puis exécutez la commande suivante :

ikvmc.exe -target:library -out:CoreRenderer.dll iText-2.0.8.jar core-renderer.jar

Poursuivre la lecture

LINQ to XML et la lecture des très gros fichiers

LINQ to XML est relativement facile à implémenter pour lire de gros fichiers et pour requêter des fichiers XML.
Par exemple, considérons ce fichier XML :

    <?xml version="1.0" encoding="utf-8" ?>
    <users>
        <user name="User1" groupid="4" />
        <user name="User2" groupid="1" />
        <user name="User3" groupid="3" />
        <user name="User4" groupid="1" />
        <user name="User5" groupid="1" />
        <user name="User6" groupid="2" />
        <user name="User7" groupid="1" />
    </users>

Supposons que vous souhaitez trouver tous les enregistrements avec groupid > 2. Vous pouvez être tenté d’implémenter la requête suivante :

    XElement doc = XElement.Load("users.xml");
    var users = from u in doc.Elements("user")
                where u.Attribute("groupid") != null &&
                int.Parse(u.Attribute("groupid").Value) > 2
                select u;
    Console.WriteLine("{0} users match query", users.Count());

Il y a un piège dans cette implémentation. La méthode XElement.Load va lire tout le fichier XML en mémoire avant de s’exécuter, et ce fichier peut être très gros.

Poursuivre la lecture

Méthodes dynamiques (classe DynamicMethod) en .NET

Utiliser la réflexion pour invoquer des méthodes non connues à la compilation peut être problématique en terme de performances dans des applications critiques. L’exécution de ces méthodes est environ 2,5 à 3 fois plus lente qu’un appel directe.
Voici un exemple :

    class Program
    {
        [DllImport("kernel32.dll")]
        static extern void QueryPerformanceCounter(ref long ticks);

        static PropertyInfo _intProp = typeof(Foo).GetProperty("IntProp", BindingFlags.Public | BindingFlags.Instance);

        static void Main(string[] args)
        {
            Foo foo = new Foo { IntProp = 10 };
            const int COUNT = 1;
            Console.WriteLine(Measure(() => ReadPropertyWithReflection(foo), COUNT));
            Console.WriteLine(Measure(() => ReadPropertyDirectly(foo), COUNT));
        }

        static void ReadPropertyWithReflection(Foo foo)
        {
            int intProp = (int)_intProp.GetValue(foo, null);
        }

        static void ReadPropertyDirectly(Foo foo)
        {
            int intProp = foo.IntProp;
        }

        static long Measure(Action action, int count)
        {
            long startTicks = 0;
            QueryPerformanceCounter(ref startTicks);
            for (int i = 0; i < count; i++)
            {
                action();
            }
            long endTicks = 0;
            QueryPerformanceCounter(ref endTicks);
            return endTicks - startTicks;
        }

        class Foo
        {
            public int IntProp { get; set; }
        }
    }

Et voici les résultats :

Type d’accès unités CPU
Invocation par accès directe 796
Invocation par Réflexion 1986

Ainsi, l’utilisation de la réflexion pour lire une propriété est 2,5 fois plus lente que l’accès directe à cette propriété.

Les méthodes dynamiques peuvent être utilisées pour générer et exécuter une méthode à l’exécution sans devoir déclarer une assemblie dynamique et un type dynamique qui contiendront la méthode. Elles représentent un moyen plus efficace pour générer et exécuter ce type de code.

Poursuivre la lecture

Transactional NTFS (partie 1/2)

Transactional NTFS et DotNet

Microsoft introduit un concept intéressant à partir des versions de Windows Vista et Server 2008.
Cette nouveauté est appelée Transactional NTFS (TxF).
Elle permet aux développeurs d’écrire des fonctions d’Entrée/Sortie garantissant le succès complet ou le rejet complet en cas d’erreur d’un ensemble d’opérations.

Malheureusement il n’existe pas de classe DotNet(au moins jusqu’à la version 3.5 SP1) permettant de manipuler simplement ce type d’opérations.

Pour manipuler ces opérations, nous avons besoin de passer par le P/Invoke pour utiliser ces fonctions :

CreateTransaction, CommitTransaction, RollbackTransaction et DeleteFileTransacted

Poursuivre la lecture

Jouer avec FindFirstFile et FindNextFile

Énumération des fichiers dans .NET est facile. Tout le monde connaît la méthode GetFiles et vous pouvez être tenté d’écrire du code comme ceci :
    var files = Directory.GetFiles(@"c:windowssystem32", "*.dll");
    foreach (var file in files)
    {
        Console.WriteLine(file);
    }

Mais si vous regardez de plus près, vous remarquerez que cette méthode retourne un tableau de chaînes. Cela pourrait être problématique si le répertoire que vous recherchez contient beaucoup de fichiers. La méthode se bloque jusqu’à ce qu’il effectue une recherche et une fois qu’il termine il va charger tous les résultats dans la mémoire. Il serait beaucoup mieux si il vient de rentrer un IEnumerable. C’est exactement ce que la méthode EnumerateFiles dans .NET 4.0. Malheureusement dans .NET 3.5 il n’y a rien pour le travail.

Dans ce post, je vais montrer comment implémenter cette fonctionnalité en utilisant les fonctions FindFirstFile et FindNextFile .

Poursuivre la lecture

Manipulations de matrices avec du code non sécurisé

La classe Matrix

Dans cet article nous allons comparer 2 méthodes qui traitent de multiplication de matrices en .Net | C#.

Nous commençons par la définition de la classe matrice :  Matrix

    class Matrix
    {
        private readonly double[,] _matrix;
        public Matrix(int dim1, int dim2)
        {
            _matrix = new double[dim1, dim2];
        }

        public int Height { get { return _matrix.GetLength(0); } }
        public int Width { get { return _matrix.GetLength(1); } }

        public double this[int x, int y]
        {
            get { return _matrix[x, y]; }
            set { _matrix[x, y] = value; }
        }
    }

Multiplications de matrices

Voici le premier algorithme de multiplication de matrice qui réalise l’opération de manière standard.

    public static Matrix NaiveMultiplication(Matrix m1, Matrix m2)
    {
        Matrix resultMatrix = new Matrix(m1.Height, m2.Width);
        for (int i = 0; i < resultMatrix.Height; i++)
        {
            for (int j = 0; j < resultMatrix.Width; j++)
            {
                resultMatrix[i, j] = 0;
                for (int k = 0; k < m1.Width; k++)
                {
                    resultMatrix[i, j] += m1[i, k] * m2[k, j];
                }
            }
        }
        return resultMatrix;
    }

Voici le second algorithme qui réalise la même chose, mais cette fois en utilisant du code non sécurisé (unsafe)

Poursuivre la lecture