Campo MarshalAsAttribute.SizeParamIndex
Dica
The .NET API Reference documentation has a new home. Visit the .NET API Browser on docs.microsoft.com to see the new experience.
Indica o parâmetro baseado em zero que contém a contagem de elementos da matriz, semelhante a size_is em COM.
Namespace: System.Runtime.InteropServices
Assembly: mscorlib (em mscorlib.dll)
Sintaxe
public short SizeParamIndex
public:
short SizeParamIndex
val mutable SizeParamIndex : int16
Public SizeParamIndex As Short
Valor do Campo
Type: System.Int16
Comentários
O SizeParamIndex campo oferece suporte a chamadas de gerenciado para não gerenciado e não gerenciado para gerenciado. Ele não tem nenhum efeito em código gerenciado que chama objetos.
Dependendo do tipo gerenciado e os atributos aplicados a ele, a matriz pode ser passada como uma matriz segura ou uma matriz de estilo C.
Quando matrizes são passadas como matrizes de estilo C, o marshaler não é possível determinar o tamanho da matriz. Portanto, para passar uma matriz gerenciada para um método ou função não gerenciada, você deve fornecer dois argumentos:
A matriz, definida por valor ou referência.
O tamanho da matriz, definido por valor ou referência.
O índice de base zero do parâmetro de tamanho de matriz é definido usando o SizeParamIndex campo.
Se você especificar ambos SizeParamIndex e MarshalAsAttribute.SizeConst com um UnmanagedType.LPArray campo, a soma dos valores dos campos produz um total de tamanho.
Para obter mais informações, consulte Marshaling padrão para matrizes.
Exemplos
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
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 );
}
Informações de Versão
Plataforma Universal do Windows
Disponível desde 8
.NET Framework
Disponível desde 1.1
Biblioteca de Classes Portátil
Com suporte no: plataformas portáteis do .NET
Silverlight
Disponível desde 2.0
Windows Phone Silverlight
Disponível desde 7.0
Windows Phone
Disponível desde 8.1
Confira Também
SizeConst
LPArray
Classe MarshalAsAttribute
Namespace System.Runtime.InteropServices
Retornar ao início