2017-04-13 7 views
-3
typedef struct _communicate_data 
{ 
    unsigned short  m_type; 
    unsigned char m_response_result; 
    union{ 
     struct request_set_integrity 
     { 
      char m_version[32]; 
      char m_installed_path[256]; 
     }REQUEST_INTEGRITY; 

     struct _request_update 
     { 
      char m_install_dir[MAX_PATH]; 
      char m_unzip_dir[MAX_PATH]; 
     }REQUEST_UPDATE;  
     struct response_dna 
     { 
      int  m_len; 
      char m_dna[256]; 
     }RESPONSE_DNA;  
     struct request_setinfo 
     { 
      int m_len; 
      char m_host[128]; 
      char m_userid[64]; 
      char m_deviceid[128]; 
     }REQUEST_SETINFO;  
     char m_reason[256];    
     struct response_realtime 
     { 
      int m_type; 
      char m_path[256]; 
     }RESPONSE_REALTIME;  
     struct response_status 
     { 
      char m_dna_status; 
      char m_realtime_status; 
      char m_policy_status; 
      char m_application_status; 
      char m_login_status; 
      char m_usb_status; 
      char m_sendlog_status; 
      char m_isolate_status; 
      char m_mode; 
     }RESPONSE_STATUS;  
     struct response_version 
     { 
      unsigned short m_major_version; 
      unsigned short m_minor_version; 
      unsigned short m_build_version; 
      unsigned short m_release_version; 
     }RESPONSE_VERSION;  
     char m_dbname[256]; 
     char m_policyname[256];  
     struct request_set 
     { 
      DNA_PERFORMACE m_performace; 
      XSP_RUN_MODE m_mode; 
     }REQUEST_SET;  
     struct response_compare 
     { 
      UINT m_type; 
      char m_path[MAX_PATH]; 
     }RESPONSE_COMP; 
    }data; 
}COMMUNICATE_DATA; 

C++에서 유니온 구조체가 있으므로이 구조체를 C# 코드로 변환해야합니다. 나는 2 일 동안 개종해야한다. [FieldOffset (0)] 속성을 올바르게 설정할 수 없습니다.C++ 유니온을 C# 구조체로 변환하는 방법

누구든지이 구조체를 공용체로 변환 할 수 있습니까? 감사합니다.

편집 이것은 C# 코드로 변환 한 것입니다. 그러나 잘못 추가 된 : 'ProjectName, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'어셈블리에서 'Common.dataunion'형식을로드 할 수 없습니다. 오프셋이 0 인 개체 필드가 ​​잘못 정렬되어 있거나 비 - 개체 필드에 의해 중첩. "

public struct dataunion 
     {  
      [FieldOffset(0)] 
      public request_set_integrity REQUEST_INTEGRITY; 
      [FieldOffset(0)] 
      public _request_update REQUEST_UPDATE; 
      [FieldOffset(0)] 
      public response_dna RESPONSE_DNA; 
      [FieldOffset(0)] 
      public request_setinfo REQUEST_SETINFO; 
      [FieldOffset(0)] 
      public byte[] m_reason; 
      [FieldOffset(0)] 
      public response_realtime RESPONSE_REALTIME; 
      [FieldOffset(0)] 
      public response_status RESPONSE_STATUS; 
      [FieldOffset(0)] 
      public response_version RESPONSE_VERSION; 
      [FieldOffset(320)] 
      public byte[] m_dbname; 
      [FieldOffset(320)] 
      public byte[] m_policyname; 
      [FieldOffset(0)] 
      public request_set REQUEST_SET; 
      [FieldOffset(0)] 
      public response_compare RESPONSE_COMP; 
     } 
     [StructLayout(LayoutKind.Sequential)] 
     public struct comData 
     {  
      public ushort m_type;   
      public byte m_response_result;   
      public dataunion data;  
     } 
+0

코드에 'FieldOffset'이 (가) 없습니다. [MCVE] –

+0

@KyleKhalaf를 제공하십시오. 일부 소스 코드로 업데이트 된 질문 – mamur

답변

0

자세한 내용은 here입니다. 나는 거기에있는 정보가 이해할 만하다고 믿으며 여기에 그것을 복제 할 필요가 없다. 행운을 빈다!

+0

위의 링크를 따라 코드를 편집했지만 여전히 오류가 있습니다. – mamur