Как вызвать dll, написанную на языке C с указателем в C #

1

Я хочу использовать dll writen в C-коде, однако интерфейс C-функции имеет параметр указателя массива. Затем, как передать массив этой функции C в С#?

@param requestBuf Буфер запросов

@param requestBufferSize Размер буфера запроса

Функция хочет позвонить:

int WriteAnswer(unsigned char* requestBuf, unsigned int requestBufferSize)

Я импортировал эту DLL, единственная проблема в том, что: я не знаю, как бороться с первым параметром, потому что ему нужен указатель на буфер.

Теги:
dll
import

2 ответа

0

Вы должны создать обертку в С# для вашей C++ DLL и функции:

[DllImport("mydll", 
   CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl ,
   CharSet = CharSet.Ansi)]
public static extern int WriteAnswer(IntPtr buffer, UInt32 bufferSize);

Чтобы вызвать функцию из С#, вы должны выделить "неуправляемый буфер", отправить на C++, а затем вернуть его в строку на С#:

IntPtr unmanagedBuffer = Marshal.AllocHGlobal(100);
// Your Unmanaged Call
WriteAnswer(unmanagedBbuffer, 100);
string yourString = Marshal.PtrToStringUni(unmanagedBuffer);
Marshal.FreeHGlobal(unmanagedBuffer);

Важно знать, какая строка C++ возвращает PtrToStringUni означает UTF16 (2 байта на символ). Возможно, вам понадобится другая функция в зависимости от типа вашей строки.

0

Чтобы использовать функцию C в С#, вы должны создать метод extern.

для его создания вы можете использовать это приложение. Он получает файл заголовка и дает вам метод extern, который вам нужен.

Информация, приведенная ниже, приведена на форумах приложения:

P/Invoker.NET генерирует сборку.NET-интерфейса (dll) при предоставлении нескольких статических dll файлов C++ и файла заголовка C++ (.h).

Он извлекает функции и переменные, экспортируемые статической dll C++, находит их определения в заголовочном файле C++, и из них генерируется сборка интерфейса.NET(dll).

Сгенерированная сборка.NET-интерфейса предоставляет приложениям.NET доступ к функциям и переменным в статических DLL C++.

  • 0
    этот ответ был полезен?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню