2010-12-09 6 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 

} 

C# код

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 

Я имею другую функцию, которая возвращает целочисленное значение просто отлично, я предполагаю, что это связано с LPBYTE себя. Цените любую помощь.

ответ

3

Я считаю, что вы хотите использовать

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

} 

Обратите внимание, что при вызове его, вам нужно будет использовать Marshall.Copy, чтобы получить данные, но это потребует, чтобы вы знаете длину данных.

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

Получил работу, блестящий. Спасибо. – unmanageddude 2010-12-09 00:30:53

0

адам Натанс книга Библия по этому

повесить на: что именно возвращаемое значение этой функции. Его указатель на что?

тест указывает на случайный адрес, то вы совать данные, где контрольные точки

Что вы хотите вернуться?

Если вы должны вернуть указатель, тогда объявите функцию возвращающим intptr, а затем вызовите Marshall для копирования байтов. THEN вам нужно решить, нужно ли вам освободить возвращенный буфер

0

Как должен быть .NET-маршаллер узнать, сколько данных нужно скопировать из возвращаемого массива в экземпляр управляемого массива?

Возможно, вы захотите прислать IntPtr, а для копирования данных используйте класс Marshal.

0

Вы должны проверить помощник Interop PInvoke здесь:

http://clrinterop.codeplex.com/

Он будет автоматически генерировать PInvoke подписи для вас.

Смежные вопросы