3

我想在非托管 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 是否会因为某种原因打乱它的真实和虚构属性?

4

2 回答 2

1

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

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

于 2012-04-05T18:22:32.257 回答
1

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

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

所有的好消息:)

于 2012-04-05T18:37:15.590 回答