7
votes

Utilisation correcte de dllimport

Supposons qu'il existe une méthode C ++ int Nativemethod (double, double *) code> dans un native.dll. Ma première tentative d'appel de cette méthode à partir du code géré a été (en supposant que je n'ai pas besoin de spécifier le point d'entrée) xxx pré>

puis pour utiliser la DLL i DID P>

[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, IntPtr outD);


2 commentaires

Quel est le message d'erreur qu'il vous donne?


Bien sûr, cela devrait être typeof (double). Mais je pense que cette taille de (typeof (Inpptr)) est toujours> = Tailleof (typeof (double)), de sorte que cela peut fonctionner d'une certaine manière. Intéressant, qu'est-ce qui est "trucs avec x" partie?


3 Réponses :


2
votes

Je ne suis pas un expert, mais ne devrait-il pas être: xxx


0 commentaires

5
votes

Le problème est que la méthode prend un double * qui est un pointeur sur un double. Vous passez dans un pointeur qui pointe vers un intPTR . Ceci est important uniquement en ce qu'il existe une différence de taille entre double (8 octets) et intPTR qui est de taille variable (soit 4 ou 8 octets). Vous devez attribuer le pointeur à un double xxx


1 commentaires

Ah, merci beaucoup .. J'ai raté la partie sur la taille spécifique à la plate-forme dans la référence MSDN.



7
votes

Je pourrais peut-être mal comprendre votre objectif, mais il semble que vous le rendez plus compliqué que nécessaire. Il suffit de le transmettre par référence et laissez le maréchalage en dessous de s'occuper de cela. xxx


5 commentaires

+1 Le plus représentatif serait d'utiliser au lieu de réf. L'OP n'a jamais initialisé le pointeur.


@Jarededpar, c'est vrai. J'étais incertain si l'Op désirait un comportement Ref ou Out, mais je n'ai pas reconnu que l'indice évident (le fait qu'il ne l'initia pas dans l'exemple).


Exactement quelles sont les implications d'utiliser out / ref ou refure allochglobal pour se rendre à la mémoire non gérée? Le GC peut-il réorganiser la mémoire et modifier les références de pointeur avant que la méthode / la fonction renvoie?


@Thomask, il y a une discussion sur ce ici


@thomask - un autre point à ce sujet. Je crois que d'utiliser / refaire pour Blittable sera plus efficace. Je pense que l'adresse de la variable simple sera transmise directement à la DLL non gérée pour la modification, de sorte qu'il n'implique pas d'allocations supplémentaires.