【发布时间】: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 成员使用预定义的结构而不是显式内存地址)
那么,有没有办法在没有不安全代码的情况下做到这一点? (其次,如果你发现我的想法有缺陷,我也很高兴听到;))
谢谢大家!
【问题讨论】:
-
如果您提供非托管
cnc_rdcurrent函数的 C 定义,将会很有帮助。还要检查以下内容:docs.microsoft.com/en-us/dotnet/framework/interop/…. -
C端定义为:short WINAPI cnc_rdcurrent(unsigned short FlibHndl,short *crrnt);