Нужно ли делать MarshalAs с примитивными типами данных из неуправляемых C ++ dll в C #? - PullRequest
0 голосов
/ 28 мая 2018

У меня есть базовый вопрос,

У меня есть неуправляемая dll на C ++, в которой есть функции с параметрами, входящими и выходящими из некоторого беззнакового символа, без знака короткого, без знака длинного, знака со знаком, короткого со знаком, типа длинной подписи.

Нужно ли маршалу это или я могу напрямую нанести на карту это?Какова лучшая практика, если таковая имеется?

например, dll

unsigned long SomeFunc(unsigned char variableA);

C # (прямая карта в C #)

[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.U4)]
public static extern uint SomeFunc(byte variableA);

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Чтобы развернуть ответ mozfox, список: byte, sbyte, short, ushort, int, uint, long, ulong, IntPtr, UIntPtr, float, double, одномерные массивы ([]) из них, struct из них.Отсутствуют bool (которые могут быть распределены по-разному), char (не спрашивайте, почему ... я не знаю), string.

0 голосов
/ 28 мая 2018

Большинство типов данных имеют общее представление как в управляемой, так и в неуправляемой памяти и не требуют специальной обработки маршалером взаимодействия.Эти типы называются blittable типами, потому что они не требуют преобразования при передаче между управляемым и неуправляемым кодом.

MSDN : https://docs.microsoft.com/en-us/dotnet/framework/interop/blittable-and-non-blittable-types

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