Salut
Je suis actuellement en train de faire des recherches pour trouver le code le plus rapide afin de créer des miniatures ou de charger des images en WPF et j'ai trouvé le top : l'utilisation de gdiplus.dll et notamment de la méthode GdipLoadImageFromFile.
En faisant des tests avec une appli Winforms en C# (.Net 2.0), l'appel de la méthode COM fonctionne nickel. Pour exemple, je charge un objet System.Drawing.Image à partir de l'url d'un fichier en 146 ms avec la méthode classique Image.FromFile, alors qu'avec la méthode COM je mets environ 2 ms !!! Le gain est énorme....mais je n'arrive pas à faire fonctionner la même méthode en WPF.
En fait, l'utilisation de cette dll (gdiplus) ou du moins cette méthode semble nécessiter des attributs ou une certaine config pour un projet WPF.
Voici la méthode, trouvée sur le net d'ailleurs, puisque j'ai du mal à comprendre comment on utilise COM :
[DllImport("gdiplus.dll", CharSet = CharSet.Unicode), SuppressUnmanagedCodeSecurity]
public static extern int GdipLoadImageFromFile(string filename, out IntPtr image);
private static Type imageType = typeof(Bitmap);
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
internal static Image FastFromFile(string filename)
{
try
{
filename = Path.GetFullPath(filename);
IntPtr loadingImage = IntPtr.Zero;
// We are not using ICM at all, fudge that, this should be FAAAAAST!
if (GdipLoadImageFromFile(filename, out loadingImage) != 0)
{
throw new Exception("GDI+ threw a status error code.");
}
return (Bitmap)imageType.InvokeMember("FromGDIplus", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod, null, null, new object[] { loadingImage });
}
catch (SecurityException)
{
return Image.FromFile(filename);
}
}
Lorsque j'appelle la méthode FastFromFile, j'obtiens sous WPF l'erreur suivante :
{System.AccessViolationException: Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
Il semble que les attributs SuppressUnmanagedCodeSecurity et SecurityPermission soient insuffisants...j'ai essayé diverses configurations dans les propriétés de mon projet ( ClickOnce, zone full trust...) mais sans résultat...
Le pire, c'est que le try/catch de la méthode FastFromFile ne joue pas son rôle, puisque l'erreur est remontée directement à ma méthode appelante de ma Form...sûrement dû au fait que ce soit du non-managé j'imagine...
Quelqu'un a une idée ou une vision globale de la sécurité des applications sous WPF ?
Merci à vous
Bye![]()
Partager