У меня есть C DLL с экспортом, который выглядит следующим образом:
__declspec(dllexport) int Function(
char *password,
unsigned char *ssid,
int ssidlength,
unsigned char *output)
{
На стороне С# я использую это следующим образом:
[DllImport("myDLL.dll", SetLastError = true)]
protected static extern int Function(
[MarshalAs(UnmanagedType.LPStr)]
string password,
[MarshalAs(UnmanagedType.LPStr)]
string ssid,
int ssidlength,
[MarshalAs(UnmanagedType.LPArray)]
byte[] output);
Это на самом деле работает просто отлично, но мне потребовалось некоторое время, чтобы выяснить, какие вещи мне нужно для маршала, как что. Есть ли какие-либо руководства, которые просто перечисляют все возможные типы данных c/cpp и их equiv С# Marshalling?
Что-то вроде:
c = > С#
Char * myVar = > [MarshalAs (UnmanagedType.LPStr)] string myVar
...
но перечислите все типы?
Причина, о которой я прошу, заключается в том, что я никогда не знаю, когда использовать "ref" или out или IntPtr, или какой тип маршал что-то вроде.
Наконец, в приведенном выше коде я сортирую указатель на массив без знака char как длинный указатель на строку. Это не кажется правильным, но оно работает. Это имеет смысл для этого в байт [] массив, но я не могу заставить его работать. Если бы была только онлайн-ссылка, которую я мог бы использовать...
В MSDN есть много руководств.
Как говорится, pinvoke.net и PInvoke Interop Помощник - отличные ресурсы для работы с собственным кодом.
Помощник interop, в частности, часто делает это очень легко.