У меня есть структура, определенная в C как:
typedef struct {
char struct_id[4];
int struct_version;
int keepAliveInterval;
……
} MQTTClient_connectOptions
Я создаю соответствующую структуру в C # следующим образом:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MQTTClient_connectOptions {
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public string struct_id;
public int struct_version;
public int keepAliveInterval;
……
}
Эта структура C # - это то, что генерируется P/ Invoke Interop Assistant, и это фрагмент кода C #, который рекомендуется несколькими публикациями в моем поиске Google.
Тот же DLL / исходный код, который определяет структуру C, также определяет функцию:
DLLExport int MQTTClient_connect(MQTTClient handle, MQTTClient_connectOptions* options);
Что я определил в своем коде C # как:
[DllImport("PahoMqttC", EntryPoint = "MQTTClient_connect", CharSet = CharSet.Ansi)]
public static extern int MQTTClient_connect(IntPtr handle, ref MQTTClient_connectOptions options);
В своем коде C # я могу установить
MQTTClient_connectOptions.struct_id = "MQTC"
, и когда я проверяю объект во время отладки, я вижу эти4 символа в этом поле.Тем не менее, когда я использую эту структуру для вызова MQTTClient_connect (), «MQTC» усекается до «MQT».
Когда я шагаю по коду, как только я шаг в MQTTClient_connect, поле struct_id изменяется с «MQTC» на «MQT \ 0» в инспекторе объектов C #, и MQTTClient_connect завершается ошибкой, потому что struct_id не соответствует ожидаемому.
Если я вместо этого определяю структуру в C #, как это:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] struct_id;
и установите его значение следующим образом:
struct_id = Encoding.ASCII.GetBytes("MQTC");
тогда все работает правильно ???
Моя цель - понять Marshaling и P / Invoke ипреобразование заголовков C / C ++ в код C #, и поэтому мне бы очень хотелось знать:
1 - Почему использование «byte []» работает при использовании «string», вызывает изменение значения struct_id при I войти в подпрограмму MQTTClient_connect ()?
2 - Есть ли способ определить структуру C # с помощью «строки», которая упростит остальную часть моего кода C #?
Спасибо!