夥計們我在調用DLL中的函數後檢索struct成員值時遇到困難。我試圖將C++代碼轉換爲C#,但我不確定它是否正確。請幫我理解我的錯誤(如果有的話)以及如何糾正。如何將聯合C++結構轉換爲C#?
我在這裏的問題是我無法正確地檢索後,我從DLL調用ReceiveMessage函數後INNER STRUCTS(聯盟)的值。例如,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
,如果我加入這個結構的UNION內的C++和C#。 .. 我有一個錯誤,說明了「......正確對齊」或「......重疊......」
C++
ConxNack oConxNack;
typedef struct
{
int Reason;
} ConxNack;
[StructLayout(LayoutKind.Sequential)]
public struct ConxNack
{
public int nReason;
}
[FieldOffset(0)]
public ConxNack oConxNack;
預先感謝您這麼多的時間,並幫助......
感謝您的回覆和鏈接。根據鏈接,聯盟內部有兩個結構。他們所做的是在Union中明確提取兩個結構和佈局的所有成員變量。在我的轉換中,我更傾向於將Union中每個結構的起始FieldOffSet都設置爲0.是不可能的? – Ryan 2011-04-12 06:28:07
唯一的區別是我仍然把每個結構中的所有成員變量。 – Ryan 2011-04-12 06:30:03
你是什麼意思創建兩個結構和只是演員取決於類型?對不起,要求... – Ryan 2011-04-12 06:50:06