Я хочу использовать dll writen в C-коде, однако интерфейс C-функции имеет параметр указателя массива. Затем, как передать массив этой функции C в С#?
@param requestBuf Буфер запросов
@param requestBufferSize Размер буфера запроса
Функция хочет позвонить:
int WriteAnswer(unsigned char* requestBuf, unsigned int requestBufferSize)
Я импортировал эту DLL, единственная проблема в том, что: я не знаю, как бороться с первым параметром, потому что ему нужен указатель на буфер.
Вы должны создать обертку в С# для вашей 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 байта на символ). Возможно, вам понадобится другая функция в зависимости от типа вашей строки.
Чтобы использовать функцию C в С#, вы должны создать метод extern.
для его создания вы можете использовать это приложение. Он получает файл заголовка и дает вам метод extern, который вам нужен.
Информация, приведенная ниже, приведена на форумах приложения:
P/Invoker.NET генерирует сборку.NET-интерфейса (dll) при предоставлении нескольких статических dll файлов C++ и файла заголовка C++ (.h).
Он извлекает функции и переменные, экспортируемые статической dll C++, находит их определения в заголовочном файле C++, и из них генерируется сборка интерфейса.NET(dll).
Сгенерированная сборка.NET-интерфейса предоставляет приложениям.NET доступ к функциям и переменным в статических DLL C++.