begin process at 2008 09 06 09:08:06
1 237 666 membres
63 nouveaux aujourd'hui
14 313 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Cast void* byte[], code non managé [ Système / Mémoire ] (renyone)

Cast void* byte[], code non managé le 08/07/2008 10:39:27

renyone
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+

Re : Cast void* byte[], code non managé le 08/07/2008 10:55:10

Liverion
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 !!

Re : Cast void* byte[], code non managé le 08/07/2008 11:06:08

renyone
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.

Re : Cast void* byte[], code non managé le 08/07/2008 11:58:31

Liverion
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 !!

Re : Cast void* byte[], code non managé le 08/07/2008 19:53:16

Lutinore
(Admin CS)
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.


Classé sous : void, byte, méthode, cast, exportedexecute

Participer à cet échange

Pub



Appels d'offres

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS