如何将C#的某个对象转换成IntPtr或其他类型的指针?(Marshal.StructureToPtr除外的方法。前提的这样的,我开发一个C#组件给C++调用,C++那边需要获取组件中的某个对象的值,这个对象是由组件负责管理的,所以C++那边获得这个对象的指针即可。)

解决方案 »

  1.   

    C#引用类型存的不就是内存堆中变量的地址吗,Mark
      

  2.   

    通过Marshal封送数据流,对方解析
      

  3.   

    只有值类型才可以得到指针。引用类型不可以。道理很简单,引用类型指向托管堆,GC随时会回收的,GC不能跟踪是否有“指针”还在指向它。
      

  4.   

    不好意思,忙其他的去了。决定还是用Marshal.StructureToPtr进行转换,内存由C++那边分配,我直接将数据拷贝进去。现在的问题是,我这边没有问题,但是别人调用会有异常。C++和C#定义的结构如下:
    C++:
    struct NReportAttr
    {
    WORD version;
    BYTE rptId;
    CString name;
    BYTE dataSource;
    BYTE dataSourceId;
    BYTE layout;
    };
    C#:
    struct ReportInputAttr
    {
            public ushort version;
            public byte rptId;
            public string name; 
            public byte dataSource;
            public byte dataSourceId;
            public byte layout;
    }
    猜测是因为CString和string内存结构不同造成的,但不知如何修改。
      

  5.   

    类似如下,要指明布局    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
        public struct FSYDItems
        {
            [MarshalAs(UnmanagedType.I4)]
            private int _seltime;
            [MarshalAs(UnmanagedType.I2)]
            private UInt16 _itemtype;
            [MarshalAs(UnmanagedType.I4)]
            private int _amount;
            [MarshalAs(UnmanagedType.R4)]
            private float _price;
            [MarshalAs(UnmanagedType.R4)]
            private float _preprice;
            [MarshalAs(UnmanagedType.R4)]
            private float _afterprice;        public int SelTime
            {
                get { return this._seltime; }
                set { this._seltime = value; }
            }
            public UInt16 ItemType
            {
                get { return this._itemtype; }
                set { this._itemtype = value; }
            }
            public int Amount
            {
                get { return this._amount; }
                set { this._amount = value; }
            }
            public float Price
            {
                get { return this._price; }
                set { this._price = value; }
            }
            public float PrePrice
            {
                get { return this._preprice; }
                set { this._preprice = value; }
            }
            public float AfterPrice
            {
                get { return this._afterprice; }
                set { this._afterprice = value; }
            }
        }
      

  6.   

    OK,搞定了。将CString 改成WCHAR[256],C# 那边对应修改成
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 256)]
     public string name;
    感谢各位的热心帮助,分不多,给大家分分。