Freigeben über


MarshalAsAttribute.SizeParamIndex-Feld

Gibt an, welcher Parameter die Anzahl der Arrayelemente enthält, ähnlich wie size_is in COM, und ist nullbasiert.

Namespace: System.Runtime.InteropServices
Assembly: mscorlib (in mscorlib.dll)

Syntax

'Declaration
Public SizeParamIndex As Short
'Usage
Dim instance As MarshalAsAttribute
Dim value As Short

value = instance.SizeParamIndex

instance.SizeParamIndex = value
public short SizeParamIndex
public:
short SizeParamIndex
public short SizeParamIndex
public var SizeParamIndex : short

Hinweise

Dieses Feld wird beim Erstellen verwalteter Objekte mit COM-Unterstützung verwendet. SizeParamIndex ist nur für verwaltete Methoden gültig, die von COM-Clients aufgerufen werden, wobei einer der Parameter ein Array ist. Da der Marshaller die Größe eines nicht verwalteten Arrays nicht bestimmen kann, wird diese Information als eigener Parameter übergeben.

Der Parameter mit der Größe muss eine als Wert übergebene Ganzzahl sein. Wenn Sie sowohl SizeParamIndex als auch MarshalAsAttribute.SizeConst mit UnmanagedType.LPArray angeben, stellt die Summe ihrer Werte einen Gesamtwert für die Größe dar. Dieses Feld wirkt sich nicht auf verwalteten Code aus, der COM-Objekte aufruft. Weitere Informationen finden Sie unter Standardmäßiges Marshalling für Arrays.

Beispiel

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
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();
    }
}
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 );
}
package SomeNamespace; 
import System.Runtime.InteropServices.*;
import SomeNamespace.*; 

/** @attribute StructLayout(LayoutKind.Sequential)
 */
public class Vertex
{
    private float x;
    private float y;
    private float z;
} //Vertex

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.
    /** @attribute DllImport("SomeDll.dll")
     */
    public static native void SomeUnsafeMethod(
        /** @attribute MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)
         */
        Vertex data[], long size);

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

class Test
{
    public static void main(String[] args)
    {
        SomeClass aClass = new SomeClass();
        aClass.SomeMethod();
    } //main
} //Test

Plattformen

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

.NET Compact Framework

Unterstützt in: 2.0

Siehe auch

Referenz

MarshalAsAttribute-Klasse
MarshalAsAttribute-Member
System.Runtime.InteropServices-Namespace
SizeConst
LPArray