C#调用dll 获取结构体数组的首地址

u013330547 2014-11-10 11:41:35
public static extern int addList (Music music , int len);
Music是一个结构体 有两个属性name和size
怎么讲参数Music类型的数组 {music1,music2,music3}传给dll?怎么获取Music集合的首地址music ?
...全文
466 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
winnowc 2014-11-10
  • 打赏
  • 举报
回复
对于简单的按值传递的结构体数组,直接传数组就可以,见http://msdn.microsoft.com/zh-cn/library/hk9wyw21(v=vs.110).aspx
u013330547 2014-11-10
  • 打赏
  • 举报
回复
引用
你的接口只需要传Music结构体就行,那你就new一个Music然后传过去就行了
但是我的数组中有三个值,music1,2,3,new一个,我传哪个?
u013330547 2014-11-10
  • 打赏
  • 举报
回复
引用
输入参数, 给复杂结构体赋值后作为输入参数传入 对于比较大的结构体指针,无法直接应用结构体类型,转化成IntPtr类型, 此时需要将原生类型转化为指针,并给指针赋值 调用方法: Marshal.StructureToPtr(stu, ptr1, true)
不是很明白
hwangt0 2014-11-10
  • 打赏
  • 举报
回复
你的接口只需要传Music结构体就行,那你就new一个Music然后传过去就行了
bdmh 2014-11-10
  • 打赏
  • 举报
回复
u013330547 2014-11-10
  • 打赏
  • 举报
回复
加10,回帖者都有份,结贴。谢谢各位。
u013330547 2014-11-10
  • 打赏
  • 举报
回复
[StructLayout(LayoutKind.Sequential)]请问这个有什么用?我修改次数太多,后来忘加了,疏忽了
GeorgePen 2014-11-10
  • 打赏
  • 举报
回复
原来是这样,我算是又学了一招
u013330547 2014-11-10
  • 打赏
  • 举报
回复
问题解决了,加上 [StructLayout(LayoutKind.Sequential)]解决了,3q
u013330547 2014-11-10
  • 打赏
  • 举报
回复
[StructLayout(LayoutKind.Sequential)]这个么?
u013330547 2014-11-10
  • 打赏
  • 举报
回复
引用
public static extern int addList ([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]Music music , int len);
这个不知道怎么传参
Saleayas 2014-11-10
  • 打赏
  • 举报
回复
你的 Music 和 C 平台一致吗? 使用 Strcut Layout 了吗?
u013330547 2014-11-10
  • 打赏
  • 举报
回复
引用
public static extern int addList ([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]Music[] music , int len);
assertion failed 声明失败 我试过
Saleayas 2014-11-10
  • 打赏
  • 举报
回复
public static extern int addList ([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]Music[] music , int len);
Saleayas 2014-11-10
  • 打赏
  • 举报
回复
public static extern int addList ([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]Music music , int len);
u013330547 2014-11-10
  • 打赏
  • 举报
回复
引用
如果是传给 C#,那么没有首地址的概念。 如果是传给 C++,那么直接使用 数组,然后 marshalAs LPArray 就可以了。
C#的结构体数组,传给C, MUSIC_DLL_EXPORT int addList (const struct Music *music, int len); [DllImport("music.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int addList (Music music , int len); C#需要传给C的数组Music[ ] music = new music[3]{music1,music2,music3} 请问怎么调用C中的addList 方法
Saleayas 2014-11-10
  • 打赏
  • 举报
回复
如果是传给 C#,那么没有首地址的概念。 如果是传给 C++,那么直接使用 数组,然后 marshalAs LPArray 就可以了。
u013330547 2014-11-10
  • 打赏
  • 举报
回复
别一个个传,dll会报错的,dll要接受一个结构体数组,而这个数组我在c#中已经获取了,但是参数的时候要传Music[ ] music的首地址,public static extern int addList (Music music , int len);(Music music , int len加起来才是数组) 所以,,,不会传了
u013330547 2014-11-10
  • 打赏
  • 举报
回复
请问6楼:我知道要传一个指针,所以才问怎么获取数组的首地址,这个指针是什么呢? 7楼把dll的接口给改了
  • 打赏
  • 举报
回复
如果接口是 addList (Music music , int len); 一种是new Music, 一个个传过去。 如果接口是 addList (Music[] music , int len); 可以new Music[],一起传了。
加载更多回复(2)

110,535

社区成员

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

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

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