2012-11-01 6 views
0

하드웨어 테스트를하고 있습니다. 우리의 테스트 프레임 워크는 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도 올바르게 업데이트됩니까? 이 경우에 managedStatusnativeStatus이 같은 메모리를 가리키고 있지 않다고 들었습니다. 마샬 러는 통화가 완료된 후 nativeState 사본을 반환합니다. 솔루션이 아니라면 무엇입니까? unsave 키워드를 사용하고 내 코드를 넣어서 fixed{} 블록에 시퀀스를 만들고 실행해야합니까?

[DllImport(@"native.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)] 
internal static unsave extern Byte someMethod(UInt32 * managedStatus) 
+0

당신이'someMethod' 잠재적 배경 실행을 kcik 수 있으며, 당신이 실행되는 상태를 액세스 할 건가요 :
또는, 그 변수를 고정 할 수 있습니다? 아니면'someMethod'는 항상 작업 과정에서 종료시 상태 코드를 설정하는 블로킹 호출입니까? – tcarvin

답변

0

그래서 필요한 변수의 위치는 시간대에 따라 변하지 않습니다.

예, fixed{}을 사용할 수 있습니다.

private uint g_Pinnable = 0; 

... 

var gc = System.Runtime.InteropServices.GCHandle.Alloc(g_Pinnable, System.Runtime.InteropServices.GCHandleType.Pinned); 

try 
{ 
    // Pass 'ref g_Pinnable' to API 
    // Then execute the sequence. 
} 
finally 
{ 
    gc.Free(); // Reference to g_Pinnable may be invalid after this point 
} 
관련 문제