[code=c]C++ Struct
struct double_dynamicArrayStruct
{
unsigned long length = 0;
double * data = nullptr;//这里原本是使用模板的
};
struct Xx_dynamicArrayStruct
{
unsigned long length = 0;
double * data = nullptr;//这里原本是使用模板的
};
C++ dll函数
double_dynamicArrayStruct newDynamicStruct(unsigned long length);
void Xx_deleteDynamicArrayStruct(double_dynamicArrayStruct&dynamicArrayStruct);
C++ exe运行结果图
[img=https://img-bbs.csdn.net/upload/201904/19/1555643149_684507.jpg][/img]
[code=csharp]C# struct
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct double_dynamicArrayStruct
{
public int length;
public double[] data;
};
引用C++Dll函数
//[DllImport("directShowUseonly.dll", EntryPoint = "getRec0_A2", CallingConvention = CallingConvention.StdCall)]
//public static extern IntPtr getReco_A2(int widths, int heights, IntPtr pData_16bitGray, IntPtr pData_16bitSrc, int widthM, int heightM, IntPtr pData_16bitModel, int referNumbersOfObject = 0);
[DllImport("directShowUseonly.dll", EntryPoint = "double_newDynamicArrayStruct", CallingConvention = CallingConvention.StdCall)]
public static extern double_dynamicArrayStruct double_newDynamicArrayStruct(int length);
[DllImport("directShowUseonly.dll", EntryPoint = "Xx_deleteDynamicArrayStruct", CallingConvention = CallingConvention.StdCall)]
public static extern void Xx_deleteDynamicArrayStruct(double_dynamicArrayStruct[] dynamicArrayStruct);
[DllImport("directShowUseonly.dll", EntryPoint = "Xx_newDynamicArrayStruct", CallingConvention = CallingConvention.StdCall)]
public static extern Xx_dynamicArrayStruct Xx_newDynamicArrayStruct(int length);
//[DllImport("directShowUseonly.dll", EntryPoint = "?double_deleteDynamicArrayStruct@@YAXAEAUdouble_dynamicArrayStruct@@@Z", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
[DllImport("directShowUseonly.dll", EntryPoint = "Xx_deleteDynamicArrayStruct", CallingConvention = CallingConvention.StdCall)]
public static extern void Xx_deleteDynamicArrayStruct(ref Xx_dynamicArrayStruct dynamicArrayStruct);
// 调用复杂结构体测试
int size = Marshal.SizeOf(typeof(double_dynamicArrayStruct)) * 100;
IntPtr pBuff = Marshal.AllocHGlobal(size); // 直接分配50个元素的空间,比Marshal.copy方便多了
//int intsize = Marshal.SizeOf(typeof(double_dynamicArrayStruct));//获取结构体占用空间大小
//IntPtr intptr= Marshal.AllocHGlobal(size);//声明一个同样大小的空间
//Marshal.StructureToPtr(typeof(double_dynamicArrayStruct), intptr, true);//将结构体放到这个空间中
double_newDynamicArrayStruct(10);
double_dynamicArrayStruct[] pClass = new double_dynamicArrayStruct[10];
for (int i = 0; i < 10; i++)
{
IntPtr ptr = new IntPtr(pBuff.ToInt64() + Marshal.SizeOf(typeof(double_dynamicArrayStruct)) * i);
pClass[i] = (double_dynamicArrayStruct)Marshal.PtrToStructure(ptr, typeof(double_dynamicArrayStruct));
Console.WriteLine(pClass[i]);
}
Marshal.FreeHGlobal(pBuff); // 释放内存
Console.Read();
总是提示尝试读取或写入受保护的内存,尝试了何种方式,都没有得到解决,有时候还出现其他错误
[/code]
支持 markdown 代码高亮,建议使用 markdown 语法
– dudu 5年前