Предположим, есть метод c ++ int NativeMethod(double, double *)
в Native.dll. Моя первая попытка вызова этого метода из управляемого кода была (при условии, что мне не нужно указывать точку входа)
[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, IntPtr outD);
Затем, чтобы использовать DLL, я сделал
IntPtr x = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));
NativeMethod(2.0, x);
//do stuff with x
Marshal.FreeHGlobal(x); //crash
Я хотел бы понять, почему это происходит здесь. Мое первое предположение состоит в том, что это проблема кучи из-за того, что DLL и мое приложение могут использовать разные CRT. Но если бы это было так, почему бы вместо этого не вызвать вызов сбоя NativeMethod? Метод вернул x, из которого я мог успешно извлечь double.
Я могу заставить импорт работать, передавая двойное по ссылке
[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, IntPtr outD);
Почему происходит сбой FreeHGlobal с первой попытки и каков рекомендуемый способ передачи указателей на нативные методы? Ключевое слово out может хорошо работать в этой ситуации, но что, если мне нужно маршалировать строку? Я не думаю, что смогу обойти AllocH и FreeH ...