2010-06-02 2 views
2

Я пытаюсь написать обертку, чтобы мой C# приложение может использовать DLL, написанный на C. Вот определение метода, который я пытаюсь обернуть:C# обертка для переменного тока DLL

void methodA(const uint32_t *data); //c header declaration 

Проблема, с которой я сталкиваюсь, пытается выяснить, как дать эквивалентный указатель из C#. В C# я хочу, чтобы работать на:

UInt32 data[] //my c# object i want to be able to pass in 

но как дать эквивалентный указатель в моей обертке? Я пробовал

ref data //my attempt at giving an equivalent pointer to the DLL 

но это, кажется, не работает. Используя операторы отладки в DLL, я вижу, что значения, которые он получает таким образом, не являются тем, что я пытаюсь передать.

Итак, мой вопрос сводится к тому, что я правильно обертываю функцию ac, которая использует указатель на ссылаться на массив?

ответ

3

Массив уже является ссылкой, поэтому он будет отображаться как указатель на него. Это должно работать:

[DllImport("my.dll")] 
static extern void methodA(UInt32[] data); 

Если вам нужно передать данные обратно в управляемый код, вам нужно украсить параметр с Out attribute:

[DllImport("my.dll")] 
static extern void methodA([In, Out] UInt32[] data); 

Использование:

uint[] data = new uint[] { 1, 2, 3, 4, 5 }; 
methodA(data); 
Console.WriteLine(data[0]); 

Другим решением является объявление параметра типа IntPtr:

[DllImport("my.dll")] 
static extern void methodA(IntPtr data); 

Для выполнения этой работы вам необходимо прикрепить массив, чтобы получить IntPtr для него, или выделить память в неуправляемом пространстве и скопировать содержимое массива в нее. Однако я бы не рекомендовал эти варианты.


ref требуется, если вы хотите, чтобы передать одно значение типа значения по ссылке:

[DllImport("my.dll")] 
static extern void methodB(ref UInt32 data); 
1

Объявить Methoda с параметром IntPtr в P/Invoke декларации. Чтобы преобразовать массив UInt32 в неуправляемый массив, используйте Marshal.Copy Method (Int32[], Int32, IntPtr, Int32).

Пример кода из этой статьи хорошо для вас, звоните Methoda после этой строки:

Marshal.Copy(managedArray, 0, pnt, managedArray.Length); 
// now call methodA with pmt parameter 
Смежные вопросы