我们知道一般在p/invoke中传递int[]时,在c++中改变了数组的值,c#中也就改变了。而如果字符串数组,就不会改变,除非加out属性。这里我想问如果是结构数组会怎么样,是像int[]那样,还是string[]那样呢。请高手解答。另外如果是一个对象数组又是什么情况呢?

解决方案 »

  1.   

    这个传递理论上只能是值类型的。
    string,stringbuilder实际上只是一个巧合。
    c++中并无法理解你传来的是基于.net什么类型,只是知道传来一个地址,我往这个地址读写数据,如果你传递对象, C++中将会顺序的填写内存。造成内存错误报出异常。暂无办法传递结构体进去。
    如果结构体,你需要用Attribute明确声明成员变量的类型,数组则需要声明ConstSize属性确定长度。
      

  2.   

    To wuyazhe:我可不可以这么理解,除了string,stringbuilder,其它对象(地址)传递到c++端,如果修改这个对象,也就是直接修改这个地址上的值,那么c#端看到的是修改后的值。是这样理解吗? 如果是这样,那么结构数组也是传递一个地址到c++端,如果改变了,c#端也是应该看到改变了的值的,对吗?
      

  3.   

    你要知道c#是托管内存的,如果内部有个变量是引用类型,那这个引用类型的对象的地址,就未必和这个对象在一起,你c++中如何找得到那块内存?如果都是顺序排列这么简单。当然就没问题了。我也很少p/invoke,不瞎扯了,如果hdt/v狗狗/sp1234/zegk能来说说还差不多。