У меня есть метод в C ++ с двумя аргументами: byte и ushort, который возвращает указатель на очень сложную структуру (это объединение почти всех структур, представленных в проекте C ++).
Когда я вызываю этот метод, используя DllImport в C #, например, передавая ему 1 и 2, он вызывается с некоторым случайным числом байтов и 1 (поэтому первый аргумент передается как второй, а действительное первое берется из некоторого другого адрес памяти).
Единственное объяснение, которое я могу придумать, о том, что возвращаемая структура не отображается правильно, и из-за этого все параметры имеют смещение. Но я не знаю, как это проверить. Существуют ли какие-либо инструменты, которые могут показывать мне адреса и размеры маршаллированных данных, генерируемых C #, поэтому я могу проверить их по адресу, который я получаю в C ++? Или любое другое решение, которое вы можете предложить.
--- Обновление ---
После комментирования структур кода для C ++ и C # я сократил тестовый код до следующего:
C ++:
enum PrimitiveType: unsigned short
enum ErrorType : unsigned char
typedef struct
{
PrimitiveType Primitive;
unsigned char InstNo; /* The instance number. */
ErrorType ErrorCode; /* ERR_NO_ERROR */
unsigned char Active; /* True = relay active */
} GetRelayCfmType;
sizeof (GetRelayCfmType) = 5
C #:
enum PrimitiveType : ushort
enum ErrorType : byte
[StructLayout(LayoutKind.Sequential)]
public struct GetRelayCfmType
{
public PrimitiveType Primitive;
public byte InstNo; /* The instance number. */
public ErrorType ErrorCode; /* RTX2300_ERR_NO_ERROR */
public byte Active; /* True = relay active */
};
Marshal.Sizeof (new GetRelayCfmType ()) == 6.
Почему размеры отличаются одним байтом?
Upd.
Теперь моя функция (C ++):
__declspec(dllexport) GetRelayCfmType __stdcall GetRelay_Blocking(unsigned char InstNo, RelayNoType No)
enum RelayNoType : unsigned char
так в C # у меня есть:
[DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)]
public static extern GetRelayCfmType GetRelay_Blocking(byte InstNo, RelayNoType No);
enum RelayNoType : byte
Теперь картинка заполнена.