MarshalAsAttribute.SizeParamIndex Поле
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Указывает параметр, содержащий отсчитываемое от нуля количество элементов массива, аналогичный параметру size_is
в COM.
public: short SizeParamIndex;
public short SizeParamIndex;
val mutable SizeParamIndex : int16
Public SizeParamIndex As Short
Значение поля
Примеры
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
Комментарии
Поле SizeParamIndex поддерживает вызовы из управляемых в неуправляемые и неуправляемые. Он не оказывает никакого влияния на управляемый код, вызывающий COM-объекты.
В зависимости от управляемого типа и применяемых к нему атрибутов массив может быть передан в виде безопасного массива или массива В стиле C.
Когда массивы передаются как массивы В стиле C, маршалер не может определить размер массива. Таким образом, чтобы передать управляемый массив в неуправляемую функцию или метод, необходимо указать два аргумента:
Массив, определенный по ссылке или значению.
Размер массива, определяемый ссылкой или значением.
Отсчитываемый от нуля индекс параметра размера массива определяется с помощью SizeParamIndex поля .
Если указать как поле, так SizeParamIndex и MarshalAsAttribute.SizeConstUnmanagedType.LPArray , сумма значений полей приведет к общему размеру.
Дополнительные сведения см. в разделе Маршалинг по умолчанию для массивов.
Применяется к
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по