Supposons qu'il existe une méthode C++ int NativeMethod(double, double *)
dans Native.dll. Ma première tentative d'appeler cette méthode de code managé a été (en supposant que je ne ai pas besoin de préciser le point d'entrée)Utilisation correcte de DllImport
[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, IntPtr outD);
ensuite utiliser la DLL Je l'ai fait
IntPtr x = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));
NativeMethod(2.0, x);
//do stuff with x
Marshal.FreeHGlobal(x); //crash
Je voudrais comprendre pourquoi cela se bloque ici. Ma première supposition est que c'est un problème de tas dû au fait que la DLL et mon application pourraient utiliser un CRT différent. Mais si c'était le cas, pourquoi l'appel de NativeMethod ne tomberait-il pas à la place? La méthode renvoyait un x que je pouvais extraire avec succès du double.
Je suis en mesure d'obtenir l'importation de travailler en passant la double par référence
[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, IntPtr outD);
Pourquoi le crash FreeHGlobal dans la première tentative, et quelle est la méthode recommandée pour passer des pointeurs vers des méthodes natives? Le mot-clé out peut fonctionner correctement cette situation, mais que se passe-t-il si j'ai besoin de Marshal une chaîne? Je ne pense pas que je peux contourner Alloch et Freeh ...
Quel est le message d'erreur qu'il vous donne? – Amy
Bien sûr, cela devrait être typeof (double). Mais je pense que SizeOf (typeof (InpPtr)) est toujours> = SizeOf (typeof (double)), donc cela peut fonctionner d'une certaine façon. Intéressant, qu'est-ce que "faire des choses avec x" partie? –