我有一个c++ 结构, 它有像下面一样的字符[ 20], 它被打包了 。
#pragma pack(push, temp_aion_packed, 1)
struct temp
{
char x[20];
char y[20];
};
#pragma pack(pop, temp_aion_packed)
现在,我怎么能在 C# 中写出这个支架, 这样两个都是一样的。 我已经在c# 中写了这样的话。
[DataContract]
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1),Serializable]
public class temp
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string x;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string y;
}
下方是 c# 中的 pinvoke 声明
[DllImport("rmsCAPI.dll", CallingConvention = CallingConvention.StdCall, ExactSpelling = true, EntryPoint = "OrderRequirement")]
public static extern int OrderRequirement(ref temp tmp);
c++ 函数,调用此构造为参数
long __stdcall OrderRequirement(struct temp *tmp)
{
string p="";
string q="";
p=temp->x;
q=temp->y;
char buff[2048];
sprintf(buff,"p: %s
q: %s
x: %s
y: %s
",p,q,temp->x,temp->y);
}
但当我在 c# 中这样做的时候, 它给了我在 c++ 中的垃圾数据, 当我在 c# 中为他们指定值时。 任何人都能帮忙吗?
感谢大家的帮助, 上面的一个, 但现在我有一个新的问题, 这是这个问题的延伸, 我提供所有细节在下面。
我在 c++ 中的结构
#pragma pack(push, temp_aion_packed, 1)
struct temp
{
long req;
struct type m_type;
short id;
char x[20];
char y[20];
};
#pragma pack(pop, temp_aion_packed)
#pragma pack(push, type_aion_packed, 1)
struct type
{
short i;
};
#pragma pack(pop, type_aion_packed)
我写了等同的c# 支架像这样
[DataContract]
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1),Serializable]
public struct temp
{
[DataMember]
public long req;
[DataMember]
[MarshalAs(UnmanagedType.Struct)]
public type m_type;
[DataMember]
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string x;
[DataMember]
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string y;
}
[DataContract]
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1),Serializable]
public struct type
{
[DataMember]
public short i;
}
下面就是我的C#pinvoke
[DllImport("rmsCAPI.dll", CallingConvention = CallingConvention.StdCall, ExactSpelling = true, EntryPoint = "OrderRequirement")]
public static extern int OrderRequirement(ref temp tmp);
下面是我的 c+++ 方法, 它调用 struct 作为参数
long __stdcall OrderRequirement(struct temp *tmp)
{
char buff[2048];
sprintf(buff,"req: %ld
id: %d
x: %s
",tmp->req,tmp->id,tmp->x);
}
现在我要面对的问题是, 我有结构变量 m_ type( strutct "type" ), 在结构温度中宣布, 之前宣布的变量( long req), 在我的 c++ 程序中打印精细, 但之后宣布的变量没有给我任何输出。 因此我认为 c# 中的结构声明混乱了, 我无法找到它, 任何人都能帮上忙 。