Маршалинг C ++ int * в C # - PullRequest
       0

Маршалинг C ++ int * в C #

2 голосов
/ 06 декабря 2010

Я пытаюсь заставить dll работать.

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

Он хорошо читает из DLL, но возвращаемые значения не верны.Я удалил входные данные, и я просто пытаюсь получить тестовый массив.Функция, которую я использую в C ++:

extern "C" EAGLE128DLL_API int* encryptFunc()
{
    //return encrypt(x, Q);

    int t[128];

    for(int i = 0; i < 128; i++)
    {
        t[i] = 5;
    }

    return t;
};

Код C #, который я использую для вызова этой функции, выглядит следующим образом:

[DllImport("C:\\Users\\Leon\\Documents\\Visual Studio 2010\\Projects\\Eagle128DLL\\Release\\Eagle128DLL.dll")]
            public static extern IntPtr encryptFunc();
    ...

IntPtr outputPtr = encryptFunc();
int[] output = new int[128];

Marshal.Copy(outputPtr, output, 0, 128);

Значения в выходном массиве должны быть всеми 5-ю.Но то, что я получаю: 16187392, 16190224 ... и т. Д. (Не 5-е)

Ответы [ 2 ]

3 голосов
/ 06 декабря 2010

Код C ++ содержит ошибку: вы возвращаете указатель на переменную, хранящуюся в стеке (t[128] - только временная переменная), которая не будет работать.Как только ваш encryptFunc вернется, стек вызовов будет размотан , а переменная t[128] будет уничтожена.

Если ваш код не нуждается в повторном входе или поточной безопасности,вы можете просто сделать t[128] статическим:

static int t[128];
...
return t;

Статическая переменная больше не будет храниться в стеке и сохранится после завершения функции.

2 голосов
/ 06 декабря 2010

Я думаю, что ваша проблема в том, что вы пытаетесь вернуть значение, которое было объявлено локально в стеке в вашей функции C.

Лучше всего передать предварительно выделенный массив вашей функции C, которая получит данные, которые создает функция, и вернет их обратно вызывающей стороне.

...