MarshalAsAttribute.SizeParamIndex Feld

Definition

Gibt den nullbasierten Parameter an, der die Anzahl von Arrayelementen enthält, vergleichbar mit size_is in COM.

public: short SizeParamIndex;
public short SizeParamIndex;
val mutable SizeParamIndex : int16
Public SizeParamIndex As Short 

Feldwert

Beispiele

using namespace System;
using namespace System::Runtime::InteropServices;

// Force the layout of your fields to the C-style struct layout.
// Without this, the .NET Framework will reorder your fields.

[StructLayoutAttribute(LayoutKind::Sequential)]
value struct Vertex
{
public:
   float x;
   float y;
   float z;
};


// Add [In] or [In, Out] attributes as appropriate.
// Marshal as a C-style array of Vertex, where the second (SizeParamIndex is zero-based)
// parameter (size) contains the count of array elements.

[DllImport("SomeDLL.dll")]
extern void SomeUnsafeMethod( [MarshalAs(UnmanagedType::LPArray,SizeParamIndex=1)]array<Vertex>^data, long size );
int main()
{
   array<Vertex>^verts = gcnew array<Vertex>(3);
   SomeUnsafeMethod( verts, verts->Length );
}
using System.Runtime.InteropServices;
using SomeNamespace;

namespace SomeNamespace
{
    // Force the layout of your fields to the C style struct layout.
    // Without this, the .NET Framework will reorder your fields.
    [StructLayout(LayoutKind.Sequential)]
    public struct Vertex
    {
        float	x;
    float	y;
        float	z;
    }

    class SomeClass
    {
        // Add [In] or [In, Out] attributes as approppriate.
        // Marshal as a C style array of Vertex, where the second (SizeParamIndex is zero-based)
        //  parameter (size) contains the count of array elements.
        [DllImport ("SomeDll.dll")]
        public static extern void SomeUnsafeMethod(
                                      [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] Vertex[] data,
                                      long size );

        public void SomeMethod()
        {
            Vertex[] verts = new Vertex[3];
            SomeUnsafeMethod( verts, verts.Length );
        }
    }
}

class Test
{
    public static void Main()
    {
        SomeClass AClass = new SomeClass();

        AClass.SomeMethod();
    }
}
Option Strict Off

Imports System.Runtime.InteropServices
Imports SomeNamespace

Namespace SomeNamespace
    ' Force the layout of your fields to the C style struct layout.
    ' Without this, the .NET Framework will reorder your fields.
    
    <StructLayout(LayoutKind.Sequential)> _
    Structure Vertex
        Dim x As Decimal
        Dim y As Decimal
        Dim z As Decimal
    End Structure

    Class SomeClass
        ' Add [In] or [In, Out] attributes as approppriate.
        ' Marshal as a C style array of Vertex, where the second (SizeParamIndex is zero-based)
        '  parameter (size) contains the count of array elements.

        Declare Auto Sub SomeUnsafeMethod Lib "somelib.dll" ( _
                                      <MarshalAs(UnmanagedType.LPArray, SizeParamIndex:=1)> data() As Vertex, _
                                      size As Long ) 

        Public Sub SomeMethod()
            Dim verts(3) As Vertex
            SomeUnsafeMethod( verts, verts.Length )
        End Sub

    End Class

End Namespace

Module Test
    Sub Main
        Dim AClass As New SomeClass

        AClass.SomeMethod
        End Sub
End Module

Hinweise

Das SizeParamIndex Feld unterstützt verwaltete bis nicht verwaltete und nicht verwaltete Aufrufe. Dies hat keine Auswirkung auf verwalteten Code, der COM-Objekte aufruft.

Abhängig vom verwalteten Typ und den darauf angewendeten Attributen kann das Array als sicheres Array oder Array im C-Stil übergeben werden.

Wenn Arrays als Arrays im C-Stil übergeben werden, kann der Marshaller die Größe des Arrays nicht bestimmen. Daher müssen Sie zwei Argumente angeben, um ein verwaltetes Array an eine nicht verwaltete Funktion oder Methode zu übergeben:

  • Das Array, das durch Verweis oder Wert definiert ist.

  • Die Arraygröße, definiert durch Verweis oder Wert.

Der nullbasierte Index des Arraygrößenparameters wird mithilfe des SizeParamIndex Felds definiert.

Wenn Sie sowohl als auch SizeParamIndexMarshalAsAttribute.SizeConst mit einem UnmanagedType.LPArray Feld angeben, ergibt die Summe der Werte der Felder eine Gesamtgröße.

Weitere Informationen finden Sie unter Standardmarsing für Arrays.

Gilt für:

Weitere Informationen