none
MarshalAs是用来做什么的 RRS feed

答案

  • 不是在C#和C++之间传递数据,是在托管堆和本地堆之间。

    Please mark the post answered your question as the answer, and click the chartreuse pyramid floating over "Vote as helpful" to mark other helpful posts as helpful. This posting is provided "AS IS" with no warranties, and confers no rights.
    Visual C++ MVP
    • 已标记为答案 阿朵 2009年7月24日 8:01
    2009年7月23日 5:17
    版主
  • 谢谢大家。
    我看了看代码终于明白了。
    这句话放在变量定义中,
    public struct _mystruct
    {
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
    public Single[] temp;
    }

    我这里是用来指定下面这个temp[]的大小为32.
    可能还没用得如各位说的那么高深……谢谢各位。。^_^

    • 已标记为答案 阿朵 2009年7月24日 8:00
    2009年7月24日 8:00

全部回复

  • 你好 MarshalAs属性 指示如何在托管代码和非托管代码之间封送数据。
    MarshalAsAttribute.Value 设置为 ByValArray 时,必须设置 SizeConst 以指示数组中的元素数。当需要区分字符串类型时,ArraySubType 字段可以选择包含数组元素的 UnmanagedType。此 UnmanagedType 只可用于作为结构中的字段的数组。 

    而SizeConst则是指数组中的元素个数


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年7月23日 2:21
    版主
  • 这是一个历史问题,因为C#的数据和C++的数据布局方式有很大的不同,然而如果在P/Invoke和COM Interop当中,又必须要在C#和C++之间传递数据,有的时候,CLR或者说.NET能够自动在两种编程语言之间转换数据,有的时候又不行,这时候就需要程序员来帮忙告诉.NET怎样转换数据了。

    MarshalAs这个属性很难用,很容易用错,用好需要对C#、C++和COM数据的布局方式有一定的了解才能做。所以做好使用一些工具来帮你,可以参照我下面的文章:
    http://blog.csdn.net/Donjuan/archive/2009/02/05/3865026.aspx

    如果你只是感兴趣的话,那就忘了这个属性吧,在.NET 4.0以后,微软会尽量解决掉这个属性。
    2009年7月23日 4:39
  • 谢谢版主的解释。能否请解释得通俗一点呢?这个感觉和msdn一样,看不懂....
    在定义一个struct 时
    在里面插上这一命令:MarshalAs    指示封送数据。。
    UnmanagedType 这个参数表明什么类型?  ByValArray 是什么意思?表示什么方式封送数据呢?

    为什么要在struct定义时,写入这个命令呢?跟不写有什么区别。
    谢谢~~~

    2009年7月23日 4:40
  • 你好!
         UnmanagedType是一个枚举,他就是指定如何将参数或字段封送到非托管代码。
         .NET下的数组都是继承于Array类的,都是引用类型的,这和传统的非托管数组有着本质的区别(过去是值类型的数组)
         这个的意思就是要把这个特性标记的元素封送成非托管数组!
    周雪峰
    2009年7月23日 5:09
    版主
  • 不是在C#和C++之间传递数据,是在托管堆和本地堆之间。

    Please mark the post answered your question as the answer, and click the chartreuse pyramid floating over "Vote as helpful" to mark other helpful posts as helpful. This posting is provided "AS IS" with no warranties, and confers no rights.
    Visual C++ MVP
    • 已标记为答案 阿朵 2009年7月24日 8:01
    2009年7月23日 5:17
    版主
  • 对,楼上说的对,是在托管堆和本地堆之间。

    2009年7月23日 5:30
  • 谢谢大家。
    我看了看代码终于明白了。
    这句话放在变量定义中,
    public struct _mystruct
    {
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
    public Single[] temp;
    }

    我这里是用来指定下面这个temp[]的大小为32.
    可能还没用得如各位说的那么高深……谢谢各位。。^_^

    • 已标记为答案 阿朵 2009年7月24日 8:00
    2009年7月24日 8:00