2012-04-05 12 views
3

Ich möchte System.Numerics.Complex in einem nicht verwalteten PInvoke-Szenario verwenden. Mit ILSpy habe ich festgestellt, dass ihm kein LayoutKind.Sequential-Attribut zugewiesen wurde.Sicher zu verwenden Numeric.Complex mit PInvoke? (Es hat nicht LayoutKind.Sequential)

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

Ist es sicher, einen Zeiger auf einen Komplex [] Array ohne Umwandlung in eine native Funktion zu geben, das gemeinsame Speicherlayout erwarten, dh .: Echt ersten, imaginärer zweiter? Oder könnte die CLR aus irgendeinem Grund ihre realen und imaginären Eigenschaften stören?

Antwort

1

Es geht Ihnen gut, denn dies ist ein struct. Es hat ein implizites [StructLayout], das sequenziell ist. Etwas, das Sie von typeof (Complex) sehen können. IsLayoutSequential. Das gleiche ist nicht wahr für eine Klasse, es erfordert eine ausdrückliche Erklärung.

Und ja, Felder können in der internen Darstellung des Objekts ausgetauscht werden. Aber das spielt keine Rolle, da der pinvoke Marshaller das Objekt marshallen muss. Es ist eine implizierte Marshal.StructureToPtr() in den Marshaller eingebaut. Fwiw, dieser Austausch wird nicht passieren, weil die Verpackung für zwei Doppel bereits optimal ist. Sie passen, ohne eine Polsterung zu hinterlassen. Der Marshaller erstellt nur einen Zeiger auf das Objekt und muss es nicht kopieren.

Alle guten Nachrichten :)