首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用DllImport

正确使用DllImport
EN

Stack Overflow用户
提问于 2010-07-13 22:47:21
回答 3查看 1.5K关注 0票数 7

假设Native.dll中有一个c++方法int NativeMethod(double, double *)。我第一次尝试从托管代码调用这个方法是(假设我不需要指定入口点)

代码语言:javascript
复制
[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, IntPtr outD);

然后使用我所做的DLL

代码语言:javascript
复制
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来使导入生效

代码语言:javascript
复制
[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, IntPtr outD);

为什么FreeHGlobal会在第一次尝试时崩溃,推荐的传递指向本机方法的指针的方式是什么?out关键字在这种情况下可能工作得很好,但是如果我需要编组一个字符串怎么办?我不认为我能绕过AllocH和FreeH..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-13 22:53:56

问题是该方法接受一个double*,它是指向双精度值的指针。您正在传递一个指向IntPtr的指针。这一点很重要,因为double (8字节)和可变大小(4或8字节)的IntPtr之间存在大小差异。您需要将指针分配给double

代码语言:javascript
复制
IntPtr x = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double));
票数 5
EN

Stack Overflow用户

发布于 2010-07-13 22:55:42

我可能误解了你的目标,但看起来你让它变得更复杂了。只需通过引用传递它,并让下面的编组来处理它。

代码语言:javascript
复制
[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, ref double outD);

double x;

x = 1;
NativeMethod( 2.0, ref x );
票数 7
EN

Stack Overflow用户

发布于 2010-07-13 22:53:14

我不是专家,但它不应该是:

代码语言:javascript
复制
IntPtr x = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double)));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3238334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档