Supposons qu'il existe une méthode C ++ puis pour utiliser la DLL i DID P> 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)
[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, IntPtr outD);
3 Réponses :
Je ne suis pas un expert, mais ne devrait-il pas être:
Le problème est que la méthode prend un double * code> qui est un pointeur sur un double. Vous passez dans un pointeur qui pointe vers un
intPTR code>. Ceci est important uniquement en ce qu'il existe une différence de taille entre
double code> (8 octets) et
intPTR code> qui est de taille variable (soit 4 ou 8 octets). Vous devez attribuer le pointeur à un
double code>
Ah, merci beaucoup .. J'ai raté la partie sur la taille spécifique à la plate-forme dans la référence MSDN.
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.
+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.
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?