askeet
@askeet

Экспорт структуры содержащей массивы из С++ в С#?

В общем столкнулся с чем то непонятным при чтении данных из DLL
Структура в dll
#pragma pack(push,1) 
typedef struct SIGMPGroup{
  int temp;
  char name[50]; //name of group
  int port; 
  char addr[50]; //network address "229."
  //int ttl;          //
  //int loop;         // 0 - no loop back, 1 - loop back
  
  SIGMPGroup():
  temp(0),
  port(0)
  //ttl(-1),
  //loop(0)
  {}
};
#pragma pack(pop)


Экспорт
#include "StreamEth.h"
#include <stdio.h>
#define dll extern "C" __declspec(dllexport)

StreamEth Eth;

dll
void Leave(const SIGMPGroup& data){
	 Eth.leave(data);
}


Вызов из С#

public static SIGMPGroup DTIGMPGroup = new SIGMPGroup { temp = 56, name = "Example",port = 4000 };
       [StructLayout(LayoutKind.Explicit, Pack = 1, CharSet = CharSet.Ansi, Size = 108)]
       public struct SIGMPGroup{
         [FieldOffset(0)] 
         public int temp;
         [ FieldOffset(4), MarshalAs(UnmanagedType.ByValTStr,SizeConst=50)]
         public string name; //name of group
         [FieldOffset(54)]
         public int port;

         [FieldOffset(58), MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
         public string addr;

       }
     
        [DllImport(Eth_DLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern void Leave(ref SIGMPGroup data);

       ImportFunctionEth.Leave(ref ImportFunctionEth.DTIGMPGroup);


После вызова функции ImportFunctionEth.Leave(ref ImportFunctionEth.DTIGMPGroup); появляется ошибка
Не удалось загрузить тип "SIGMPGroup" из сборки "ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", так как он содержит поле объекта со смещением 58, которое неверно выровнено или перекрыто полем, не представляющим объект.

Хотя если закоментировать код
[FieldOffset(58), MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
         public string addr;


Все работает , почему так происходит?
  • Вопрос задан
  • 2647 просмотров
Пригласить эксперта
Ответы на вопрос 2
AxisPod
@AxisPod
А чего вернет sizeof в C++ для данной структуры?
Ответ написан
askeet
@askeet Автор вопроса
Получилось что бы код заработал , только так

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
        public struct SIGMPGroup
        { 
            public int temp;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
            public string name; //name of group
            public int port;
 
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
            public string addr;
        }


Но в случае с LayoutKind.Explicit , выдает ошибку с неправильным смещением 58.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы