我对C#中的互操作非常缺乏经验,现在正在为指针问题而苦苦挣扎。我有一个外部编译的DLL和一个C#应用程序接口(不能改变里面的东西)。Interop代码本身看起来像(并且必须更改bot )
[DllImport("FWLIB32.dll", EntryPoint="cnc_rdcurrent")]
public static extern short cnc_rdcurrent( ushort FlibHndl, out short a );第二个参数(根据文档)是一个短数组的地址,外部调用将把数据放入其中。实际大小是在运行时确定的。
目前,我正在考虑这样的事情(未测试)
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成员使用预定义的结构,而不是显式的内存地址)
那么,有没有办法在不使用不安全代码的情况下做到这一点呢?(第二,如果你发现我的想法有缺陷,我也很乐意听到;)
谢谢大家!
发布于 2018-12-03 17:51:22
因此,如果元素N的数量是已知的,并在上面指定的其他地方定义,我建议使用以下方法:
[DllImport("FWLIB32.dll", EntryPoint="cnc_rdcurrent")]
public static extern short cnc_rdcurrent( ushort FlibHndl, ref short[] crrnt );使用时:
// 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将结果复制到预分配的内存中。不需要不安全的代码。
https://stackoverflow.com/questions/53588568
复制相似问题