C # импорт C Dll.Указатель массива в структуре.Как? - PullRequest
1 голос
/ 19 декабря 2010

Мне нужна ваша помощь.

Я пытаюсь импортировать C Dll в проект C #. При этом мне нужно передать структуру между проектами Dll и C # в обоих направлениях.

Вот определение C:

struct mwBITMAP 
{
 int bmWidth;
 int bmHeight;
 BYTE* bmData;
}; 

Вот определение C #:

   [StructLayout(LayoutKind.Sequential)] 
    public struct MwRemoteBmp
    {
        public int Width;
        public int Height;
        public byte[] Data;
    }

Я пытался передать структуру (данные хорошо инициализированы) из C # в функцию тестирования dll по ссылке Ширина и высота правильные. Но все данные неверны.

Где я допустил ошибки?

Ответы [ 2 ]

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

Да, массив маршалируется как SAFEARRAY. Не разбить маршаллер пинвока довольно необычно. Объявите элемент Data как IntPtr, затем используйте Marshal.Copy () для копирования данных.

Помните, что это будет сложно использовать и в Си. Есть проблема с управлением памятью, не ясно, кому принадлежит массив. Чаще всего функция C будет использовать malloc () для выделения массива. Это большая проблема, вы не можете освободить этот массив в C #, нет способа вызвать free (). У вас будет непоправимая утечка памяти. Если вы не можете переписать код C, вам нужно написать оболочку на языке C ++ / CLI, чтобы вы могли вызывать free (). Даже это сложно, если C dll не использует тот же CRT, что и код C ++ / CLI. Вы должны скомпилировать код C с параметром / MD.

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

Используйте тип IntPtr вместо типа byte []. В вашем примере:

[StructLayout(LayoutKind.Sequential)] 
public struct MwRemoteBmp
{
    public int Width;
    public int Height;
    public IntPtr Data;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...