gpt4 book ai didi

c# - 如何将带有 Union 的 C++ 结构转换为 C#?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:05:36 26 4
gpt4 key购买 nike

伙计们,我在调用 DLL 中的函数后检索结构成员值时遇到困难。我尝试将 C++ 代码转换为 C#,但我不确定它是否正确。请帮助我理解我这里的错误(如果有的话)以及如何改正。

我的问题是,在从 DLL 调用 ReceiveMessage 函数后,我无法正确检索 INNER STRUCTS(Union)的值。例如 m_objMsg.MsgData.StartReq.MsgID 始终为 0。但是当我尝试使用 C++ .exe 程序时,MsgID 具有正确的值。 (不是 0)

C++代码:

extern int ReceiveMessage(SESSION, int, Msg*);  

typedef struct
{
char SubsId[15];
int Level;
char Options[12];
} ConxReq;

typedef struct
{
char MsgId[25];
} StartReq;


typedef struct
{
long Length;
short Type;
union
{
ConxReq oConxReq;
StartReq oStartReq;
} Data;
} Msg;


/////////////////////////////////////////////////////
Msg oMsg;
int rc=ReceiveMessage(Session, 0, &oMsg);

switch(rc)
{
case 0:
switch(oMsg.Type)
{
case 0: // ConxReq

break;

case 1: // StartReq

break;

}

这是我尝试将其转换为 C# 的尝试:

[DllImport("MyDLL.dll",
CallingConvention = CallingConvention.Cdecl,
CharSet = CharSet.Ansi)]
protected static extern Int32 ReceiveMessage(IntPtr session,
Int32 nTimeOut,
[MarshalAs(UnmanagedType.Struct)] ref Msg ptrMsg);


[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct ConxReq
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)]
public string SubsId;

public Int32 Level;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
public string Options;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct StartReq
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 25)]
public string MsgId;
}


[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
protected struct Msg
{
public int Length;
public Int16 Type;
public Data MsgData;
}

StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
public struct Data
{
[FieldOffset(0)]
public ConxReq oConxReq;

[FieldOffset(0)]
public StartReq oStartReq;
}


Msg m_objMsg = new Msg();
m_objMsg.MsgData = new Data();
m_objMsg.MsgData.oConxReq = new ConxReq();
m_objMsg.MsgData.oStartReq = new StartReq();

int rc = ReceiveMessage(m_Session, nTimeOut, ref m_objMsg);


then the SWITCH Condition

如果我在 C++ 和 C# 的 UNION 中添加这个结构...我收到一条错误消息,指出“...不正确对齐”或“...重叠...”

C++

ConxNack oConxNack;

typedef struct
{

int Reason;

} ConxNack;


[StructLayout(LayoutKind.Sequential)]
public struct ConxNack
{
public int nReason;
}

[FieldOffset(0)]
public ConxNack oConxNack;

非常感谢您的时间和帮助...

最佳答案

Akash 是对的,请看这里:http://social.msdn.microsoft.com/Forums/en/csharplanguage/thread/60150e7b-665a-49a2-8e2e-2097986142f3

另一种选择是创建两个结构并在知道它是哪种类型后使用适当的转换。

第一个

马里奥

关于c# - 如何将带有 Union 的 C++ 结构转换为 C#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5630149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com