我正在做硬件测试。我们的测试框架是用 C# 编写的,但我们使用本机 dll 与硬件通信。
假设我们有一个 C++ 方法:
unsigned char someMethod(unsigned long * nativeStatus)
它依次执行嵌入式命令并在命令完成时返回状态。
为了使用它,我们创建了一个包装器
[DllImport(@"native.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
internal static extern Byte someMethod(ref UInt32 managedStatus)
这工作正常。但是有一种情况,someMethod
调用实际上并没有执行命令,而只是将其添加到序列中。然后可以通过发送特殊命令 say 来执行序列ExecuteSequence
。在执行序列时,C++ 代码nativeStatus
只需将数据复制到nativeStatus
指针引用的内存中即可更新。随着序列完成,ExecuteSequence
方法返回。此时我确信所有数据(nativeStatus
在这种情况下)都已更新。我的managedStatus
也会正确更新吗?我听说在这种情况下managedStatus
并nativeStatus
没有指向同一个内存。nativeState
Marshaler 只是在调用完成后返回一个副本。如果不是,解决方案是什么?我是否需要使用 unsave 关键字并将创建和执行序列的代码放在fixed{}
堵塞?
[DllImport(@"native.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
internal static unsave extern Byte someMethod(UInt32 * managedStatus)