Cast void* byte[], code non managé

renyone Messages postés 71 Date d'inscription vendredi 9 mars 2007 Statut Membre Dernière intervention 12 avril 2010 - 8 juil. 2008 à 10:39
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 8 juil. 2008 à 19:53
Salut !

J'ai un programme C# qui appelle une dll c++ exportant une méthode du type :

private unsafe static extern long ExportedExecute(void* inputChain);

J'ai également une méthode qui me renvoie un byte[] (c#).

Enfin ma méthode test (c#) est de la forme:

public unsafe static void Test()
        {
            byte[] bytes = CustomFormatType(input);
            void* voidPtr;
            //ExportedExecute();
        }

J'aimerais pouvoir appeller ma fonction C++ ExportedExecute avec le tableau de byte (bytes) mais je ne sais pas comment.

Merci d'avance.
A+

4 réponses

Liverion Messages postés 296 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 18 août 2008
8 juil. 2008 à 10:55
Essaie avec la classe System.BitConverter et sa methode GetBytes. Par contre tu devras faire un cast intermediaire de ton void* car le type n'est pas géré ;)

~~
Les trois lois de Codes-Sources :
Loi 1) Tu lis et respectes le reglement
Loi 2) Tu penses à valider si une reponse apportée à ton problème t'a aidé
Loi 3) Si tu ne respectes pas les 2 premières ....TU SORS !!
0
renyone Messages postés 71 Date d'inscription vendredi 9 mars 2007 Statut Membre Dernière intervention 12 avril 2010 3
8 juil. 2008 à 11:06
Excuse moi mais j'ai pas très bien saisi.
C'est justement le problème de cast qui me pose problème... :S

Merci.
0
Liverion Messages postés 296 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 18 août 2008
8 juil. 2008 à 11:58
En fait la methode GetBytes de BitConverter te renvoie bien un byte[] representant le parametre en entrée, mais les types en entrée sont : string, int , long , double ......  (pour la liste complète voir la msdn  :p )

~~
Les trois lois de Codes-Sources :
Loi 1) Tu lis et respectes le reglement
Loi 2) Tu penses à valider si une reponse apportée à ton problème t'a aidé
Loi 3) Si tu ne respectes pas les 2 premières ....TU SORS !!
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
8 juil. 2008 à 19:53
Salut,

Il est possible de passer un simple tableau managé de types blittables ( int, byte .. ) vers du code non-managé le runtime va marshaller correctement le tableau en pointeur. Sinon il faut utiliser un IntPtr pour passer l'adresse du tableau.. Il faudra d'abord fixer le tableau soit avec le mot clé fixed et du code unsafe soit avec la méthode GChandle.Alloc.

Par contre pour récupérer le tableau en valeur de retour c'est obligatoirement un IntPtr, là encore il faudra utiliser du code unsafe pour lire les données du IntPtr ou faire une copie avec Marshal.Copy.
0
Rejoignez-nous