【问题标题】:C# interop with array pointer as short without unsafeC# 与数组指针的互操作很短,没有不安全
【发布时间】:2018-12-03 06:29:47
【问题描述】:

我对 C# 中的互操作非常缺乏经验,并且现在正在努力解决指针问题。我有一个外部编译的 DLL 和一个 C# API(不能改变那里的东西)。互操作代码本身看起来像(并且必须更改机器人)

[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 成员使用预定义的结构而不是显式内存地址)

那么,有没有办法在没有不安全代码的情况下做到这一点? (其次,如果你发现我的想法有缺陷,我也很高兴听到;))

谢谢大家!

【问题讨论】:

标签: c# pointers interop


【解决方案1】:

所以,如果元素的数量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 将结果复制到预分配的内存中。不需要不安全的代码。

【讨论】:

  • 我无法/被允许更改互操作代码段本身
  • 嗯,这很糟糕。在您提供的示例中,您将未管理的数组地址转换为一个短(16 位)值,这将不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 2013-06-10
  • 2023-01-08
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多