可以安全地使用Numeric.Complex和PInvoke吗? (它没有LayoutKind.Sequential)

时间:2012-04-05 18:14:27

标签: clr complextype memory-layout

我想在非托管PInvoke场景中使用System.Numerics.Complex。使用ILSpy,我注意到它没有分配LayoutKind.Sequential属性。

/// <summary>Represents a complex number.</summary>
[Serializable]
public struct Complex : IEquatable<Complex>, IFormattable
{
    private double m_real;
    private double m_imaginary;
    ...

给一个指向Complex []数组的指针是否安全,而不转换为期望公共内存布局的本机函数,即:真正的第一个,想象的第二个?或者由于某种原因,CLR可能会扰乱其真实和虚构的属性吗?

2 个答案:

答案 0 :(得分:1)

LayoutKind.Sequential是所有主要.NET编译器的默认设置:http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.layoutkind.aspx

即使它不会:改变属性顺序的唯一理由是对齐问题。由于System.Numerics.Complex只有两个双成员,因此没有理由交换它们。所以IMO你是安全的。

答案 1 :(得分:1)

你很好,因为这是 struct 。它有一个隐含的[StructLayout],它是顺序的。你可以从typeof(Complex)看到的东西.IsLayoutSequential。对于类来说,为真,它需要一个明确的声明。

是的,字段可以在对象的内部表示中交换。但这并不重要,因为pinvoke marshaller必须编组物体。在marshaller中有一个隐含的Marshal.StructureToPtr()。 Fwiw,这种交换不会发生,因为两个双打的包装已经是最佳的。它们适合而不留任何填充物。所以marshaller只是创建一个指向对象的指针,而不必复制它。

所有好消息:)