vendredi 1 juillet 2011

Marshalling en .NET, quelle galère !

Bonjour à tous,

Je n’ai pas consacré beaucoup de temps ces temps-ci au mon blog. Cela ne m’a pas empêché de travailler sur un projet perso. J’en avais déjà parlé à quelques collègues, mon but est de me faire un media center basé sur VLC en WPF. J’avais 3 idées en têtes :

  • Intégrer sans WindowsFormsControlHost la vidéo de VLC pour pouvoir avec la puissance de WPF au niveau des transformations
  • Avoir une interface Metro
  • Avoir une interface Web/REST me permettant de contrôler mon Media Center (de la même façon que l’API sur la FreeboxHD)

C’est maintenant chose faite pour deux de ces trois tâches : une interface métro est assez simple à réaliser en WPF. Par contre, l’intégration de VLC l’est beaucoup moins. Avec l’aide d’un collègue qui a pas mal navigué dans le monde de la 3D, j’ai pu décortiquer le module direct3D de VLC et le reproduire en C#. VLC étant codé en C, il a fallu créer des délégués. J’ai voulu utiliser un wrapper tout fait comme vlcdotnet. Mais là encore, le wrapper bas niveau n’était encore pas réalisé comme il le fallait. Mais il m’a fallu vraiment beaucoup de temps avant de comprendre que mon problème venait du marshalling de .NET. un int* ne peut pas être marshallé en int[] parce que la taille n’est pas connue. Du coup j’avais un tableau de taille 1 alors que c’était un tableau de taille 5 sur VLC. Bref, cumuler des erreurs de marshalling sur 3 callbacks différents, ca fait beaucoup d’erreurs pour comprendre pourquoi ca marche pas…

Aucun commentaire: