2015-07-07 4 views
0

Я пытаюсь использовать функцию dll, объявленную как void Process(char* data) с C#.
Передача аргумента char * на C++ DLL-функцию из приложения C#

dll предоставляет различные функции для работы с OculusRift. Эта функция должна отображать в Oculus изображение данных и используется другим полностью функционирующим приложением.

В моем коде я генерирую байт [] из растрового изображения, затем преобразую его в другие вещи (char [], добавьте StringBuilder, ...), чтобы передать это функции Process.

Я загружаю эту функцию процесса из DLL через LoadLibrary (для загрузки DLL) + GetProcAdress (для доступа к функции). Я не могу использовать DLLImport, потому что я хочу быть как можно ближе к тому, как интерфейс другого приложения (написанного на C++) работает с DLL.

Я попытался с помощью
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void Process([MarshalAs(UnmanagedType.LPStr)]StringBuilder data);

или просто
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void Process(StringBuilder data);

(я прочитал проходящее строку/StringBuilder может сделать трюк, потому что это выстраивали по умолчанию как символ *). В результате у меня была полная строка, переданная как аргумент для DLL, а не char *.

Я попытался передать IntPtr в качестве аргумента тоже, используя маршал Co и

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void Process(IntPtr data);.
В результате у меня было исключение нарушения доступа к памяти.

Затем я пробовал различные вещи, используя небезопасный код, например, реализацию всего процесса создания данных из другого приложения (для моих целей мне нужна только упрощенная версия) или создания данных, как я хочу в char [], а затем копируя этот символ [] на символ *, который я прошел в

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] private unsafe delegate void Process(char* data);

в результате стека исключений переполнения из stackalloc и в памяти нарушение прав доступа Exception.

На данный момент, я думаю, что мне что-то не хватает и нужна ваша помощь. Я не знаю, есть ли какая-то блокировка, вызывающая ошибку исключения из памяти (я убедился, что изображение имеет нужный размер), я не знаю, не полностью ли я неправильно понял процесс маршалинга и т. Д.

Надеюсь, я достаточно подробно рассказал о своей проблеме.

+0

* В моем коде, я генерировать байт [] из растрового изображения, а затем преобразовать его в другие вещи (char [], добавьте StringBuilder, ...) * Возможно ли использовать [ASCII art] (https://en.wikipedia.org/wiki/ASCII_art)? Поскольку изображение представляет собой изображение, 'string' является' string' ... – xanatos

+0

Фактически, я получаю байт [] из растрового изображения. Затем, благодаря «Encoding.Unicode.GetChars (bytes)», я могу преобразовать эти байты в char. Я не пытаюсь загрузить образ BitMap непосредственно на char. – Mebius

+0

Изображение - это изображение, строка '' '' строка' ... Вы не смешиваете их. Вероятно, ваш метод принимает параметр 'byte []'. Каков источник этого изображения? Это в правильном формате? – xanatos

ответ

0

В C символ используется для представления байтов, потому что в C тип байт не существует. Или просто равен char.

Так карту из C#:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
private delegate void Process([MarshalAs(UnmanagedType.LPArray)]byte[] data); 

или

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
private delegate void Process(byte[] data); 

С уважением