하드웨어 테스트를하고 있습니다. 우리의 테스트 프레임 워크는 C#으로 작성되었지만 네이티브 dll을 사용하여 하드웨어와 통신합니다. 회전에 포함 된 명령을 실행 때 명령이 완료 상태를 반환Dll 가져 오기 및 반환 매개 변수
unsigned char someMethod(unsigned long * nativeStatus)
:
우리가 C++ 방법을 말한다. 우리가이 작품을 잘[DllImport(@"native.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
internal static extern Byte someMethod(ref UInt32 managedStatus)
래퍼를 생성하여 사용합니다. 그러나 someMethod
호출이 실제로 명령을 실행하지 않고 시퀀스에 추가하는 시나리오가 있습니다. 그런 다음 특수 명령 인 ExecuteSequence
을 전송하여 시퀀스를 실행할 수 있습니다. 시퀀스가 실행될 때 C++ 코드는 nativeStatus
포인터가 참조하는 메모리에 데이터를 복사하여 nativeStatus
을 업데이트합니다. 시퀀스가 완료되면 ExecuteSequence
메서드가 반환됩니다. 현재 모든 데이터 (이 경우 nativeStatus
)가 업데이트되었다고 확신합니다. 내 managedStatus
도 올바르게 업데이트됩니까? 이 경우에 managedStatus
과 nativeStatus
이 같은 메모리를 가리키고 있지 않다고 들었습니다. 마샬 러는 통화가 완료된 후 nativeState
사본을 반환합니다. 솔루션이 아니라면 무엇입니까? unsave 키워드를 사용하고 내 코드를 넣어서 fixed{}
블록에 시퀀스를 만들고 실행해야합니까?
[DllImport(@"native.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
internal static unsave extern Byte someMethod(UInt32 * managedStatus)
당신이'someMethod' 잠재적 배경 실행을 kcik 수 있으며, 당신이 실행되는 상태를 액세스 할 건가요 :
또는, 그 변수를 고정 할 수 있습니다? 아니면'someMethod'는 항상 작업 과정에서 종료시 상태 코드를 설정하는 블로킹 호출입니까? – tcarvin