Маршал C ++ int массив в C # - PullRequest
       16

Маршал C ++ int массив в C #

9 голосов
/ 23 сентября 2010

Я хотел бы упорядочить массив целых чисел от C ++ до C #.У меня есть неуправляемый C ++ DLL, который содержит:

DLL_EXPORT int* fnwrapper_intarr()
{
    int* test = new int[3];

    test[0] = 1;
    test[1] = 2;
    test[2] = 3;

    return test;
}

с объявлением в заголовке extern "C" DLL_EXPORT int* fnwrapper_intarr();

Затем я использую pinvoke для маршалинга в C #:

[DllImport("wrapper_demo_d.dll")]
[return: MarshalAs(UnmanagedType.SafeArray)]
public static extern int[] fnwrapper_intarr();

И я использую функцию следующим образом:

int[] test = fnwrapper_intarr();

Однако во время выполнения программы я получаю следующую ошибку: SafeArray cannot be marshaled to this array type because it has either nonzero lower bounds or more than one dimension.

Какой тип массива я должен использовать?Или есть лучший способ упорядочить массивы или векторы целых чисел?

1 Ответ

18 голосов
/ 23 сентября 2010
[DllImport("wrapper_demo_d.dll")]
public static extern IntPtr fnwrapper_intarr();

IntPtr ptr = fnwrapper_intarr();
int[] result = new int[3];
Marshal.Copy(ptr, result, 0, 3);

Вам также нужно написать функцию Release в неуправляемой Dll, которая удаляет указатель, созданный fnwrapper_intarr.Эта функция должна принимать IntPtr в качестве параметра.

DLL_EXPORT void fnwrapper_release(int* pArray)
{
    delete[] pArray;
}

[DllImport("wrapper_demo_d.dll")]
public static extern void fnwrapper_release(IntPtr ptr);

IntPtr ptr = fnwrapper_intarr();
...
fnwrapper_release(ptr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...