Советы по созданию C ++ DLL для использования из .NET - PullRequest
1 голос
/ 02 июля 2010

Эй, ребята, я создаю DLL на C ++ и хочу, чтобы ее можно было использовать в приложениях .NET (как на C #, так и на VB.NET).Я искал в Интернете советы, и то, что я нашел до сих пор, подсказывает:

  • Объявление моих функций C ++ как внешних C и использование __stdcall
  • Использование основных типов C для параметрови возвращать типы вместо контейнеров STL (например, char * вместо std :: string)
  • Использование указателей для входных параметров, которые необходимо изменить вместо ссылок

Предполагается, что typedef unsigned charbyte;

Это функция сжатия.Ожидаемые входные данные - это входные данные (переданные как byte *), размер входных данных (переданные как int), указатель на переменную, в которой будет храниться сжатый размер (переданный как int *), и строка вкакие сообщения об ошибках могут быть сохранены при необходимости (передаются как char *).Функция malloc является выходным буфером, записывает выходные данные и возвращает байт *, и ожидается, что вызывающий код освободит буфер, когда он завершит его использование.В случае возникновения ошибки сообщение об ошибке помещается в строку ошибки strcpy'd и возвращается указатель NULL.

Все ли в порядке с моей текущей настройкой или мне нужно внести некоторые другие изменения, чтобы она былавызывается из .NET?

1 Ответ

2 голосов
/ 02 июля 2010

Управляемый код не может освободить память, у него нет доступа к распределителю, встроенному в CRT. Вместо этого вы можете использовать CoTaskMemAlloc () для выделения буфера, управляемый код может вызвать Marshal.FreeCoTaskMem (). Вы должны будете объявить аргумент указателя буфера как «ref IntPtr» или объявить тип возвращаемого значения функции как IntPtr. Что дает управляемому коду сложность преобразования его в массив управляемых байтов.

Это не красиво, эти проблемы исчезают, когда вы пишете код на C ++ / CLI или пишете COM-сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...