c#与c++之间的交互

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;
    };





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值