2010-12-09 9 views
1

Ich versuche, nicht verwalteten Code mit C# aufzurufen.C# ruft nicht verwalteten Code auf

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 

} 

C# -Code

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 

ich eine andere Funktion habe, die nur gut einen int-Wert zurückgibt, denke ich, dass es im Zusammenhang selbst LPBYTE. Schätze jede Hilfe.

Antwort

3

Ich glaube, Sie

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

} 

Hinweis verwenden möchten, wenn Sie es nennen, müssen Sie Marshall.Copy verwenden, um die Daten aus zu bekommen, aber dies erfordert, dass Sie die Länge der Daten kennen.

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

Habe es funktioniert, brilliant. Vielen Dank. – unmanageddude

0

adam nathans Buch ist die Bibel auf diesem

hängen an: Was genau ist der Rückgabewert dieser Funktion ist. Es ist ein Zeiger auf was?

Prüfpunkte auf zufällige Adresse, dann stecken Sie Daten, wo Prüfpunkte

Was möchten Sie zurückkehren wollen?

Wenn Sie einen Zeiger zurückgeben müssen, dann deklarieren Sie die Funktion als Returning intptr und rufen Sie dann Marshall an, um Bytes zu kopieren. Dann müssen Sie entscheiden, ob Sie den zurückgegebenen Puffer freigeben müssen.

0

Wie sollte der .NET-Marshaller wissen, wie viele Daten vom zurückgegebenen Array in eine verwaltete Array-Instanz kopiert werden müssen?

Sie können versuchen, ein IntPtr als Ergebnis zu akzeptieren und dann die Marshal Klasse zu verwenden, um die Daten zu kopieren.

Verwandte Themen