MarshalAsAttribute.SizeParamIndex 欄位

定義

指示哪一個以零起始的參數含有陣列元素的計數,類似 COM 中的 size_is

C#
public short SizeParamIndex;

欄位值

範例

C#
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();
    }
}

備註

欄位 SizeParamIndex 支援 Managed 到 Unmanaged 和 Unmanaged-to-managed 呼叫。 它不會影響呼叫 COM 物件的 Managed 程式代碼。

根據 Managed 型別和套用至它的屬性,陣列可以傳遞為安全陣列或 C 樣式陣列。

當陣列以 C 樣式陣列傳遞時,封送處理器無法判斷陣列的大小。 因此,若要將 Managed 陣列傳遞至 Unmanaged 函式或方法,您必須提供兩個自變數:

  • 由參考或值定義的陣列。

  • 數位大小,由參考或值定義。

陣列大小參數以零起始的索引是使用 SizeParamIndex 欄位所定義。

如果您同時SizeParamIndex使用 欄位來指定 和 UnmanagedType.LPArrayMarshalAsAttribute.SizeConst ,則欄位值的總和會產生大小總計。

如需詳細資訊,請參閱 數位的預設封送處理

適用於

產品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

另請參閱