2010-12-09 2 views
1

C#을 사용하여 관리되지 않는 코드를 호출하려고합니다.C# 비 관리 코드 호출

extern "C" __declspec(dllexport) LPBYTE DataReceived(LPBYTE signals) 
{ 
    LPBYTE test; 
    *(WORD*)(test) = 0x0C; 
    *(WORD*)(test + 2) = 0x1000; 

    return test; 
    // I even tried returning 0x00 only; and I was still getting the exception 

} 

내가 잘 int 값을 반환하는 다른 기능을 데

internal sealed class Test 
{ 
    [DllImport("testlib.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
    public static extern byte[] DataReceived(byte[] signals); 

} 

// signals is byte[] too 
byte[] foo = Test.DataReceived(signals); 

//exception that occurs 
A first chance exception of type 'System.Runtime.InteropServices.MarshalDirectiveException 

C# 코드, 나는 자신을 LPBYTE 관련 같아요. 어떤 도움을 주시면 감사하겠습니다. 정확히이 함수의 반환 값이 무엇인지 :

답변

3

나는 당신이 당신이 그것을 호출 할 때, 당신은 밖으로 데이터를 얻을 수 Marshall.Copy를 사용할 필요가 있음을

internal sealed class Test 
{ 
    [DllImport("testlib.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
    public static extern IntPtr DataReceived(byte[] signals); 

} 

주를 사용하려는 생각하지만, 당신은 데이터의 길이를 알고이 필요합니다.

IntPtr fooPtr = Test.DataRecieved(signals); 
var foo = new byte[LENGTH]; 
Marshall.Copy(fooPtr, foo, 0, LENGTH); 
+0

훌륭하게 작동합니다. 고맙습니다. – unmanageddude

0

아담 nathans 책에 걸어이

에 성경입니다. 무엇에 대한 포인터인가? 임의의 주소로

테스트 포인트는, 당신은 테스트 포인트가

당신이 반환 할 않는 데이터를 찌를?

포인터를 반환해야하는 경우 function을 intptr을 반환하는 것으로 선언 한 다음 Marshall을 호출하여 바이트를 복사합니다. 반환 된 버퍼를 해제해야하는지 결정해야합니다.

0

반환 된 배열에서 관리되는 배열 인스턴스로 얼마나 많은 데이터를 복사해야 하는지를 .NET 마샬 러가 어떻게 파악해야합니까?

결과로 IntPtr을 수락 한 다음 Marshal 클래스를 사용하여 데이터를 복사 할 수 있습니다.

0

는 여기에서의 PInvoke 상호 운용성 지원을 체크 아웃해야합니다 : 그것은 자동으로 PInvoke를 서명을 생성합니다

http://clrinterop.codeplex.com/

.

관련 문제