Bonjour à tous,
J'essaye d'utiliser un SDK permettant d'interagir avec les périphériques d'un réseau ArtNet (protocole de communication DMX via le une couche UDP).
La librairie est écrite en C et se nomme DongleArtNet.dll et j'aimerais pouvoir utiliser au moins quelques une de ces fonctionnalités en C#.
Le SDK est inclus dans une application appelé DMX-WorkShop
Une documentation développeur est fournit ainsi que des exemples, notamment un exemple en visualc++ qui fonctionne très bien avec mon VC++ 6.
Dans la documentation il est expliqué le cycle de fonctionnement du SDK.
Il faut commencer par appelé une fonction nommé ArtNetInit dont voici la signature en C :
extern "C" WORD DLL_MODE ArtNetInit(char* NewIp);
DLL_MODE étant définit comme ceci :
#define DLL_MODE __declspec(dllimport)
Je ne connais pas grand chose au langage C mais après quelques recherche je suis arrivé à une définition C# :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| using System;
using System.Text;
using System.Runtime.InteropServices;
namespace ArtNetWrapper
{
public static class Wrapper
{
[DllImport("DongleArtNet.dll", EntryPoint = "_ArtNetInit")]
public static extern int ArtNetInit(StringBuilder ipPtr);
private static String ip = "2.255.255.255";
private static StringBuilder builder;
public static void ArtNetInit()
{
Wrapper.builder = new StringBuilder(Wrapper.ip);
int result = Wrapper.ArtNetInit(Wrapper.builder);
}
}
} |
Cela ne fonctionne pas j'ai un message d'erreurs :
Un appel à la fonction PInvoke 'ArtNetWrapper!ArtNetWrapper.Wrapper::ArtNetInit' a déséquilibré la pile. Cela peut se produire, car la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.
Pourtant une fenêtre blanche s'affiche et une icône apparait dans la zone de notification (cette librairie lorsqu'elle est utilisé dans d'autre application comme DMX-WorkShop affiche un SplashScreen et un icône dans la zone de notification à son démarrage) et Windows me demande même de débloquer le Firewall pour mon application (il y a donc bien tentative d'accès au réseau.)
Visiblement le paramètre ou la valeur de retour de la fonction n'est pas du bon type.
J'ai essayé de jouer sur le Charset , sur le Marshalling vers des types différents rien n'y fait.
Plusieurs questions me viennent :
- Le type C WORD est-il bien un int16 en C# ?
- Pourquoi le point d'entrée est _ArtNetInit alors que dans le code C elle est déclarée comme ArtNetInit ?
- Comment passer un type char* C ?
- Existe-t-il un tableau de correspondances des types non managés C avec les types managés C# ?
- il y-as t-il une autre solution ( code unsafe mais c'est pas bien ! ou faire un wrapper en C++ avec des types compréhensible pour le marshalling de .net ) ?
Pour le contexte le protocole DMX permet de commander des projecteurs de toutes sortes (lumière, vidéo, ...) et leurs paramètres (couleurs, rotation ...) il est très utilisé dans le monde du spectacle. Le protocole ArtNet permet de connecter tout ce beau monde sur un réseau informatique et de communiquer avec. On peut imaginer comme application une console lumière virtuel par exemple (bien loin de mes balbutiements).
Pour moi, je développe en C# ou en Visual BASIC (pas par choix
) des applications très très métiers (gestion des infrastructures autoroutières). Je ne connais presque rien au C ni au C++.
Partager