C++写的动态库中的结构在C#中怎么声明
小弟现在有一个相同的问题想请教大家c++结构:
typedef struct _Model
{
char Model[10]; // model
char Version[6]; // version
} TModel, *PModel;
C++调用:int NT_GetModel(unsigned long LineID, BYTE CtrlID, TModel *rModel);
我现在想在C#中调用,不知道该怎么解决啊,能不能指教小弟一二,呵呵……
我这里的问题是:能够正常执行,但返回不了正确的值;
我定义的C#结构:
[StructLayout(LayoutKind.Sequential, Size = 404, CharSet = CharSet.Unicode)]
public struct PModel
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public byte[] Model;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] Version;
}
C#调用: [DllImport("TC3XY.dll", CharSet = CharSet.Ansi)]
public static extern int NT_GetModel(ushort LineID, short CtrlID, ref PModel rModel);//获得设备型号和版本
麻烦各拉,指导一下小弟,不胜感激!
--------------------编程问答-------------------- 一般要返回字符串可以用StringBuilder。
下面代码我没有测试,不过你不妨试一下。
--------------------编程问答-------------------- [StructLayout(LayoutKind.Sequential, Size = 404, CharSet = CharSet.Unicode)]
[StructLayout(LayoutKind.Sequential)]
public struct PModel
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public StringBuilder Model;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public StringBuilder Version;
}
[DllImport("TC3XY.dll", CharSet = CharSet.Ansi)]
public static extern int NT_GetModel(long LineID, byte CtrlID, ref PModel rModel);
{
PModel model = new PModel();
model.Model = new StringBuilder(10);
model.Version = new StringBuilder(6);
NT_GetModel(0, 0, ref model);
}
public struct PModel
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public char[] Model;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public char[] Version;
}
[DllImport("TC3XY.dll", CharSet = CharSet.Ansi)]
public static extern int NT_GetModel(ushort LineID, short CtrlID, ref PModel rModel);// --------------------编程问答-------------------- c++ code
void GetStr(str &st)
{
st.cx=10;
st.cy=11;
}
typedef struct str
{
int cx;
int cy;
};
c#
[DllImport("t2.dll")]
public static extern void GetStr(ref str x);
str st = new str();
GetStr(ref st);
int x=st.cx;//x=10; --------------------编程问答--------------------
首先谢谢你回答我的问题,我试过拉,有这样的问题:
{"无法封送处理类型为“EkcoTog.PModel”的字段“Model”: 结构字段或类字段的类型不能是 StringBuilder。通常可采用以下方法达到同样的效果,即: 使用一个 String 字段并预先对该字段进行初始化,使其成为一个长度与相应缓冲区的长度相符的字符串。":""} --------------------编程问答--------------------
兄弟,谢谢你的回答:用CHAR[]和用BYTE[]效果一样。 --------------------编程问答--------------------
谢谢回答,这个我知道。我问题的关键是“char Version[6]; // version”在C#结构中怎么定义 --------------------编程问答--------------------
[DllImport("cplusplus.dll")]
public static extern ECODE GetBinData([MarshalAs(UnmanagedType.LPStr)] StringBuilder pData, [MarshalAs(UnmanagedType.I4)] ref int pnLen);
这是可用的代码的一部分,你参考一下吧
其中ECODE是C++中的结构体,其他应该能看明白 --------------------编程问答-------------------- struct
{
char a;
char b;
char c;
char d;
char e;
char f;
}
............................... --------------------编程问答-------------------- 这次作过测试了:-)
class Program
{
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct PModel
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=10)]
public string Model;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string Version;
}
[DllImport("TC3XY.dll")]
public extern static void NT_GetModel(int LineID, byte CtrlID, ref PModel pModel);
static void Main(string[] args)
{
PModel model = new PModel();
NT_GetModel(0, 0, ref model);
// model.Model == hello
// model.Version == 1.2
}
}
--------------------编程问答-------------------- 在c++中,可以使用com组件,使用variant类型,
// TC3XY.cpp
typedef struct _Model
{
char Model[10]; // model
char Version[6]; // version
}TModel, *PModel;
extern "C"
{
__declspec(dllexport) int NT_GetModel(unsigned long LineID, BYTE CtrlID, TModel* rModel)
{
strcpy(rModel->Model, "hello");
strcpy(rModel->Version, "1.2");
}
}
C#中使用object类型即可 --------------------编程问答-------------------- 用gomoku的方法,需要显示指定字符集为CharSet=CharSet.Ansi
--------------------编程问答-------------------- 没遇到过这种情况. --------------------编程问答--------------------
补充:.NET技术 , C#