C++中结构体嵌套联合体,联合体中又嵌套结构体,在C#中应该如何封送?

银斌 王 0 信誉分
2025-03-05T09:15:43.97+00:00

下面是源码

typedef struct {                                                                         
  unsigned int busType;
  union {
    struct {
      unsigned int bitRate;
      unsigned char sjw;
      unsigned char tseg1;
      unsigned char tseg2;
      unsigned char sam;  
      unsigned char outputMode;
      unsigned char reserved1[7];
      unsigned char canOpMode;
    } can;
    struct {
      unsigned int  arbitrationBitRate;     
      unsigned char sjwAbr;
      unsigned char tseg1Abr;
      unsigned char tseg2Abr;
      unsigned char samAbr;  
      unsigned char outputMode;
      unsigned char sjwDbr;       
      unsigned char tseg1Dbr;
      unsigned char tseg2Dbr;
      unsigned int  dataBitRate;
      unsigned char canOpMode;
    } canFD;
    struct {
      unsigned int  activeSpeedGrade;
      unsigned int  compatibleSpeedGrade;
      unsigned int  inicFwVersion;
    } most;
  
      unsigned int  status;                 // XL_FR_CHANNEL_CFG_STATUS_xxx 
      unsigned int  cfgMode;                // XL_FR_CHANNEL_CFG_MODE_xxx 
      unsigned int  baudrate;               // FlexRay baudrate in kBaud 
    } flexray;
    struct {
      unsigned char macAddr[6]; // MAC address (starting with MSB!)
      unsigned char connector;  // XL_ETH_STATUS_CONNECTOR_xxx
      unsigned char phy;        // XL_ETH_STATUS_PHY_xxx
      unsigned char link;       // XL_ETH_STATUS_LINK_xxx
      unsigned char speed;      // XL_ETH_STATUS_SPEED_xxx
      unsigned char clockMode;  // XL_ETH_STATUS_CLOCK_xxx
      unsigned char bypass;     // XL_ETH_BYPASS_xxx
    } ethernet;
    struct {
      unsigned short channelDirection;
      unsigned short res1;
      union {
        struct {
          unsigned int bitrate;
          unsigned int parity;
          unsigned int minGap;
        } tx;
        struct {
          unsigned int bitrate;
          unsigned int minBitrate;
          unsigned int maxBitrate;
          unsigned int parity;
          unsigned int minGap;
          unsigned int autoBaudrate;
        } rx;
        unsigned char raw[24];
      } dir;
    } a429;
    unsigned char raw[28];
  } data;
} XLbusParams; 

typedef struct s_xl_channel_config {
          char                name [XL_MAX_LENGTH + 1];
          unsigned char       hwType;                               //!< HWTYPE_xxxx (see 
          unsigned char       hwIndex;                              //!< Index of the hardware 
          unsigned char       hwChannel;                            //!< Index of the channel 
          unsigned short      transceiverType;                      //!< TRANSCEIVER_TYPE_xxxx 
          unsigned short      transceiverState;                     //!< transceiver state 
          unsigned short      configError;                          //!< 
          unsigned char       channelIndex;                         //!< Global channel index 
          XLuint64            channelMask;                          //!< Global channel mask 
          unsigned int        channelCapabilities;                  //!< capabilities which are 
          unsigned int        channelBusCapabilities;               //!< what buses are 
                                                                    //!< activated (e.g. 
          // Channel          
          unsigned char       isOnBus;                              //!< The channel is on bus
          unsigned int        connectedBusType;                     //!< currently selected bus      
          XLbusParams         busParams;
          unsigned int        _doNotUse;                            //!< introduced for compatibility reasons since EM00056439
                                                        
          unsigned int        driverVersion;            
          unsigned int        interfaceVersion;                     //!< version of interface with driver
          unsigned int        raw_data[10];
                              
          unsigned int        serialNumber;
          unsigned int        articleNumber;
          char                transceiverName [XL_MAX_LENGTH + 1];  //!< name for CANcab or another transceiver
          unsigned int        specialCabFlags;                      //!< XL_SPECIAL_CAB_XXX flags
          unsigned int        dominantTimeout;                      //!< Dominant Timeout in us.
          unsigned char       dominantRecessiveDelay;               //!< Delay in us.
          unsigned char       recessiveDominantDelay;               //!< Delay in us.
          unsigned char       connectionInfo;                       //!< XL_CONNECTION_INFO_XXX
          unsigned char       currentlyAvailableTimestamps;         //!< XL_CURRENTLY_AVAILABLE_TIMESTAMP...
          unsigned short      minimalSupplyVoltage;                 //!< Minimal Supply Voltage of the Cab/Piggy in 1/100 V
          unsigned short      maximalSupplyVoltage;                 //!< Maximal Supply Voltage of the Cab/Piggy in 1/100 V
          unsigned int        maximalBaudrate;                      //!< Maximal supported LIN baudrate
          unsigned char       fpgaCoreCapabilities;                 //!< e.g.: XL_FPGA_CORE_TYPE_XXX
          unsigned char       specialDeviceStatus;                  //!< e.g.: XL_SPECIAL_DEVICE_STAT_XXX
          unsigned short      channelBusActiveCapabilities;         //!< like channelBusCapabilities (but without core dependencies)
          unsigned short      breakOffset;                          //!< compensation for edge asymmetry in ns 
          unsigned short      delimiterOffset;                      //!< compensation for edgdfde asymmetry in ns 
          unsigned int        reserved[3];
        } XL_CHANNEL_CONFIG;

typedef XL_CHANNEL_CONFIG  XLchannelConfig;
typedef XL_CHANNEL_CONFIG  *pXLchannelConfig; 

typedef struct s_xl_driver_config {
          unsigned int      dllVersion;
          unsigned int      channelCount;  // total number of channels
          unsigned int      reserved[10];
          XLchannelConfig   channel[XL_CONFIG_MAX_CHANNELS];    // [channelCount]
        } XL_DRIVER_CONFIG;

C#
C#
一种面向对象的类型安全的编程语言,它起源于 C 语言系列,包括对面向组件的编程的支持。
210 个问题
0 个注释 无注释
{count} 票

1 个答案

排序依据: 非常有帮助
  1. Minxin Yu 13,091 信誉分 Microsoft 外部员工
    2025-03-06T02:33:34.1566667+00:00

    您好,

    嵌套的成员在其他地方声明后再在上一级的结构使用。

    1. https://learn.microsoft.com/en-us/dotnet/framework/interop/marshalling-classes-structures-and-unions#declaring-prototypes-2

    或者按照布局直接声明内部的变量。
    2 . https://learn.microsoft.com/en-us/dotnet/framework/interop/marshalling-classes-structures-and-unions#platform-sample
    可以参考这个问题中的示例:
    https://stackoverflow.com/questions/71426822/marshaling-complex-c-structs-with-c-unions-for-c-sharp


    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。

    注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    0 个注释 无注释

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。