c++的代码是非托管的.而.net是托管的. 那么c++和.net之间互相调用或者传送数据的时候.就需要 封送数据到非托管代码 或者 到托管代码.
而且他们之间的类型也是不兼容的.
如C#里面的string类型,c++是没有的.所以 如果像传 Int ,double一般不会有问题.但是string 传值 最好用intptr . 指针类型互相传值一般出状况的时候少
C# 的 string 给c++ string类型可以转成intptr 然后c++方面用wachar_t*来接. 或者c#方 把string 加上 marshalas特性.然后c++方面用wchar_t[]接
也可以string到 LCPSTR
c#的结构体 加 structlayout特性 可以 与c++ 方 同样定义的结构体类型传递.
c#的数字 c++ 用指针接.
c++传字符串给c# 是wchar_t* 到 intptr.
c++传结构体到c# 也是 两边需要有同样的 结构体的定义. 然后字符串的地方用指针.
c#内 intptr 与 各种类型的转换 使用 using System.Runtime.InteropServices命名空间下的 marshal和marshalas等
Example:
c#
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct STBaseData
{
public int m_nID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string m_sName;
}
c++
struct STElemBaseData
{
int m_nID;
wchar_t m_sName[100];
};
ex2:
c#传数组 需要把 数组转成Intptr,然后传给c++之后,c++ 以指针来接. (实际上就是数组的首地址)
枚举可以直接传.也可以转成int传递.
LIst<vector<string>> 这样的结构传递,要把string vector<string> List<vector<string>> 都封装成结构体后再传递.
类似
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct ZIO_QueryResultTableCell
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string m_sValue;
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct ZIO_QueryResultTableRow
{
public IntPtr m_pCell;
public int m_nCount;
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct ZIO_QueryResultTable
{
public IntPtr m_pRow;
public int m_nCount;
};