Я пытаюсь использовать функцию 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.
На данный момент, я думаю, что мне что-то не хватает и нужна ваша помощь. Я не знаю, есть ли какая-то блокировка, вызывающая ошибку исключения из памяти (я убедился, что изображение имеет нужный размер), я не знаю, не полностью ли я неправильно понял процесс маршалинга и т. Д.
Надеюсь, я достаточно подробно рассказал о своей проблеме.
* В моем коде, я генерировать байт [] из растрового изображения, а затем преобразовать его в другие вещи (char [], добавьте StringBuilder, ...) * Возможно ли использовать [ASCII art] (https://en.wikipedia.org/wiki/ASCII_art)? Поскольку изображение представляет собой изображение, 'string' является' string' ... – xanatos
Фактически, я получаю байт [] из растрового изображения. Затем, благодаря «Encoding.Unicode.GetChars (bytes)», я могу преобразовать эти байты в char. Я не пытаюсь загрузить образ BitMap непосредственно на char. – Mebius
Изображение - это изображение, строка '' '' строка' ... Вы не смешиваете их. Вероятно, ваш метод принимает параметр 'byte []'. Каков источник этого изображения? Это в правильном формате? – xanatos