首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#不可移动动态分配数组

C#不可移动动态分配数组
EN

Stack Overflow用户
提问于 2013-09-11 07:30:54
回答 2查看 172关注 0票数 0

我正在C#中创建一个数据采集应用程序,该应用程序调用DLL (由数据采集卡供应商提供),它要求我在该DLL中注册I/O缓冲区。我有一个写入线程,它用信号样本填充缓冲区。我看到了一种奇怪的行为,在一段时间后,输出信号变成了噪声,我怀疑这是因为GC将我的缓冲区移到了某个地方,所以DLL中的代码有一个指向错误地址的指针,并将垃圾输出到DAC。

1)如何检查是否正确(数组已被移动)?

2)如果是,如何使数组不可移动?MSDN上的固定大小缓冲器页面说我可以做一个固定大小的缓冲区,但是我需要动态地分配它(这样就可以在获取开始之前对其进行调优)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-11 07:33:29

你用:

代码语言:javascript
复制
int[] myarray = new int[1000];

GCHandle handle = GCHandle.Alloc(myarray, GCHandleType.Pinned);

记得

代码语言:javascript
复制
handle.Free();

在最后。因此,如果DLL方法生成一个线程并立即返回,通常最好将句柄放在类的字段中,而不是作为局部变量。

注意,如果您需要使一个数组在函数调用的时间内活动,那么您就不需要这样做了。例如:

代码语言:javascript
复制
int[] myarray = new int[1000];
MyPInvokeMethod(myarray);

MyPInvokeMethod的整个生命周期中,数组将被自动固定。

票数 2
EN

Stack Overflow用户

发布于 2013-09-11 07:35:28

代码语言:javascript
复制
int[] data = new int[size];
GCHandle h = GCHandle Alloc(data, GCHandleType.Pinned);
IntPtr ptr = h.AddrOfPinnedObject();

// ptr points to fixed memory which is not moved by GC 
// and can be accessed by unmanaged code

// ...

h.Free();     // now array can be moved
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18735182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档