Справка по прототипу C # DLL extern

2

У меня есть 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 как длинный указатель на строку. Это не кажется правильным, но оно работает. Это имеет смысл для этого в байт [] массив, но я не могу заставить его работать. Если бы была только онлайн-ссылка, которую я мог бы использовать...

  • 0
    Основная хитрость в том, что вы можете использовать IntPtr вместо любого указателя. И часто гораздо лучше использовать его вместо ключевых слов out или ref, потому что вы можете оставить много параметров пустыми при вызове функции.
Теги:
marshalling

2 ответа

1

В MSDN есть много руководств.

Как говорится, pinvoke.net и PInvoke Interop Помощник - отличные ресурсы для работы с собственным кодом.

Помощник interop, в частности, часто делает это очень легко.

0

http://pinvoke.net/default.aspx/misc.Suggested%20Reading

Ещё вопросы

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