Pinvoke传递结构体数组指针

john_jia 2008-11-18 11:35:51
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Result
{

public double value;
public Int32 time;

}


bool Get(unsigned long count,Result* p);


p这里应该是结构体Result数组指针。


Get方法在C#怎样对应?


[DllImport(....
public static extern bool Get([In,Out] uint count,....
...全文
345 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2009-11-26
  • 打赏
  • 举报
回复
得看内存是在哪里分配。
在托管堆上分配,传递给非托管函数时用ref
非托管函数在COM堆上分配,传递给托管代码时用out
在非托管堆上分配,传递给托管代码时要复制数据到托管堆。
audio007 2009-11-26
  • 打赏
  • 举报
回复
最近也在弄C++类型转C#的代码,
感觉有些代码C++容易实现的功能,C#要绕一圈用 P Invoke实现。。。。
lee_3do 2009-11-25
  • 打赏
  • 举报
回复
请问楼主你的问题解决了吗?我也遇到同样的问题,郁闷啊.....
wzd24 2008-11-19
  • 打赏
  • 举报
回复
钉住数组试试。
john_jia 2008-11-19
  • 打赏
  • 举报
回复
bloodish 的方法我早试过了,
返回的count值不对。
john_jia 2008-11-19
  • 打赏
  • 举报
回复
内存空间是分配了的。但是按照你的ref Result[] ,报:引发类型为“System.ExecutionEngineException”的异常
john_jia 2008-11-18
  • 打赏
  • 举报
回复
我在count前面加了 [In,Out]或者不加,就会出现 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
后来改成 ref count,就没这个错误了,但是调用dll返回的结果值(results )不对。
gomoku 2008-11-18
  • 打赏
  • 举报
回复
did you allocate the space before calling the dll ?

void Test()
{
Result[] results = new Result[10];
bool succeeded = Get( (uint)results.Length, results );
}
john_jia 2008-11-18
  • 打赏
  • 举报
回复
尝试读取或写入受保护的内存。这通常指示其他内存已损坏
gomoku 2008-11-18
  • 打赏
  • 举报
回复
public static extern bool Get(uint count, [In,Out] Result[] results);
wzd24 2008-11-18
  • 打赏
  • 举报
回复
你必须先定义数组以申请足够大的内存空间。

如:

public static extern bool Get(uint count, ref Result[] results);

Result[] results=new Result[5];

Get(5,ref results);
bloodish 2008-11-18
  • 打赏
  • 举报
回复
[DllImport(....
public static extern bool Get(uint count, [In,Out] Result[] results);
改为
public static extern bool Get(ref uint count, [In,Out] Result[] results);

PInvoke函数对于引用类型的参数加ref或out关键字
john_jia 2008-11-18
  • 打赏
  • 举报
回复
我检查了,的确是引用类型,在VC6中调用也是
usinged long count;
Get(&count...);
就正确的。
gomoku 2008-11-18
  • 打赏
  • 举报
回复
bool Get(unsigned long count,Result* p);
其中的unsigned long count一定不能对应ref uint count的。ref count传入的是一个整数的地址,而c++原形需要的是那个数字。

我建议你首先确认c++函数的原形。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧