【发布时间】:2010-07-13 14:47:20
【问题描述】:
假设在 Native.dll 中有一个 c++ 方法int NativeMethod(double, double *)。我第一次尝试从托管代码调用此方法是(假设我不需要指定入口点)
[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,我可以从中成功提取双精度。
我可以通过引用传递双精度来使导入工作
[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, IntPtr outD);
为什么 FreeHGlobal 在第一次尝试时会崩溃,将指针传递给本机方法的推荐方法是什么? out 关键字在这种情况下可能工作得很好,但是如果我需要编组一个字符串怎么办?我认为我无法绕过 AllocH 和 FreeH...
【问题讨论】:
-
它给你的错误信息是什么?
-
当然,这应该是typeof(double)。但我认为 SizeOf(typeof(InpPtr)) 总是 >= SizeOf(typeof(double)),所以它可能以某种方式起作用。有趣的是,什么是“do stuff with x”部分?
标签: c# dll pinvoke marshalling unmanaged