【发布时间】:2013-11-27 12:47:34
【问题描述】:
我在 C# 中有一个这样的结构:
[StructLayout(LayoutKind.Sequential, Pack = 8)]
public struct MyStruct
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 17)]
public string StringValue;
public uint IUintValue;
}
以及原生代码中对应的结构体
struct MyStruct
{
char StringValue[17];
ulong UintValue;
}
我的目标是使用 pinvoke 将这个结构的数组从 c# 端传递到 c++(本机端)。 这是我在 c# 中的使用方法
[DllImport(@"MyLibrary.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern int SendArray([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]ref MyStruct[] arr, int recordsCount);
调用代码是:
var array = new MyStruct[10];
//initialize
SendArray(ref array, array.Length);
在本机方面,我有以下函数签名:
extern "C" __declspec(dllexport) int SendArray(MyStruct** Arr, int recordsCount);
而且它似乎只适用于数组中的第一个元素。在 c++ 方面,我得到了这个数组,但只有第一个元素被正确编组。其余的似乎都是垃圾。
我的错误在哪里?
【问题讨论】:
-
那绝对应该是 MyStruct* Arr,由 C# 端的 MyStruct[] 匹配 without ref。添加一些测试代码并确保 C 端的 sizeof(MyStruct) 与 C# 端的 Marshal.SizeOf(MyStruct) 匹配。如果不是,那么第二个和后续元素将是垃圾。
-
C#字符串和char[17]一样吗?
-
如果大小不匹配,为什么第一个元素被正确编组?
标签: c# c++ arrays pinvoke marshalling