Supongamos que hay un método C++ int NativeMethod(double, double *)
en Native.dll. Mi primer intento de llamar a este método desde el código administrado fue (suponiendo que no necesito para especificar el punto de entrada)Uso correcto de DllImport
[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, IntPtr outD);
A continuación, utilizar el archivo DLL que hice
IntPtr x = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));
NativeMethod(2.0, x);
//do stuff with x
Marshal.FreeHGlobal(x); //crash
Me gustaría entender por qué esto se bloquea aquí. Mi primera suposición es que es un problema de montón debido al hecho de que el DLL y mi aplicación podrían estar usando un CRT diferente. Pero si ese fuera el caso, ¿por qué la llamada al NativeMethod no se interrumpiría? El método devolvió una x de la que pude extraer el doble con éxito.
soy capaz de obtener la importación de trabajar haciendo pasar el doble por referencia
[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, IntPtr outD);
¿Por qué el accidente FreeHGlobal en el primer intento, y lo que es la forma recomendada para pasar punteros a métodos nativos? La palabra clave out puede funcionar bien en esta situación, pero ¿qué pasa si necesito Marshal una cadena? No creo que pueda moverse Alloch y Freeh ...
¿Cuál es el mensaje de error que le da? – Amy
Por supuesto, esto debería ser typeof (doble). Pero creo que SizeOf (typeof (InpPtr)) siempre es> = SizeOf (typeof (double)), por lo que puede funcionar de alguna manera. Interesante, ¿qué es "hacer cosas con x"? –