首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组指针为短且不安全的C#互操作

数组指针为短且不安全的C#互操作
EN

Stack Overflow用户
提问于 2018-12-03 14:29:47
回答 1查看 186关注 0票数 0

我对C#中的互操作非常缺乏经验,现在正在为指针问题而苦苦挣扎。我有一个外部编译的DLL和一个C#应用程序接口(不能改变里面的东西)。Interop代码本身看起来像(并且必须更改bot )

代码语言:javascript
复制
[DllImport("FWLIB32.dll", EntryPoint="cnc_rdcurrent")]
public static extern short cnc_rdcurrent( ushort FlibHndl, out short a );

第二个参数(根据文档)是一个短数组的地址,外部调用将把数据放入其中。实际大小是在运行时确定的。

目前,我正在考虑这样的事情(未测试)

代码语言:javascript
复制
            short* c = stackalloc short[N];
            for (int i = 0; i < N; i++) c[i] = 0;
            short cc = (short)c;

            int NCReadCode = Focas1.cnc_rdcurrent(flibHndl, out cc);

但这需要不安全的代码。因为应用程序的其余部分是完全安全的(其他API成员使用预定义的结构,而不是显式的内存地址)

那么,有没有办法在不使用不安全代码的情况下做到这一点呢?(第二,如果你发现我的想法有缺陷,我也很乐意听到;)

谢谢大家!

EN

回答 1

Stack Overflow用户

发布于 2018-12-03 17:51:22

因此,如果元素N的数量是已知的,并在上面指定的其他地方定义,我建议使用以下方法:

代码语言:javascript
复制
[DllImport("FWLIB32.dll", EntryPoint="cnc_rdcurrent")]
public static extern short cnc_rdcurrent( ushort FlibHndl, ref short[] crrnt );

使用时:

代码语言:javascript
复制
// Create result array, reserve memory on managed heap
// Items are initialized to 0 by default
short[] resultArray = new short[N];

int NCReadCode = Focas1.cnc_rdcurrent(flibHndl, ref resultArray);

因此,托管程序集负责数组内存管理,而非托管DLL将结果复制到预分配的内存中。不需要不安全的代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53588568

复制
相关文章

相似问题

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