【发布时间】:2015-10-26 05:58:32
【问题描述】:
填充一个包含字符串的 stuct 数组,我测试了一个发现,在 c# 中它通过指针执行得更快:
struct name{
int intv;
IntPtr strv;
}
当通过GetPacksPtr() 实现时:(参见下面的代码/签名)
这就是我编码的方式,但不确定我是否做得对......
说 ArrL=10,000
DataPack* DataPackArr;
List<DataPack> DataPackLst = new List<DataPack>(ArrL);
GetPacksPtr(ArrL, &DataPackArr);
DataPack* CurrentPack = DataPackArr;
for (int i = 0; i < ArrL; i++, CurrentPack++)
{
DataPackLst.Add(new DataPack() { strv = CurrentPack->strv, intv = CurrentPack->intv });
}
我在哪里可以释放分配的内存,如
__stdcall 定义非托管代码必须释放内存,但谁是“按合同”的所有者......这令人困惑,我试图负责释放分配以最小的性能损失。
c++
extern "C" __declspec(dllexport) void __stdcall GetPacksPtr(int size, DataPack** DpArrPtr )
{
*DpArrPtr = (DataPack*)CoTaskMemAlloc( size * sizeof( DataPack ));
DataPack CurPackPtr = *DpArrPtr;
char aStr[]= "abcdefgHi";
for ( int i = 0; i < size; i++,CurPackPtr++ )
{
CurPackPtr->IntVal=i;
CurPackPtr->buffer = (char*)malloc(sizeof(aStr));
strcpy(CurPackPtr->buffer, aStr);
}
}
c#
[DllImport("exported.dll", CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurity]
public static extern void GetPacksPtr(int RaySize, DataPack** DataPackArr);
【问题讨论】:
-
如果这只是 c++,你为什么要标记c?你为什么
extern "C"?你明白你在做什么吗? -
@iharob 请参阅将字符串从 C++ API 返回到 C# =>limbioliong.wordpress.com/2011/06/16/…
-
我不是那个意思,我的意思是 c 不是 c++,你在混合东西。
-
@iharob 看看这个链接上的例子请...我也在学习....
标签: c# c++ c memory-management pinvoke