MarshalAsAttribute Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Указывает, как маршалировать данные между управляемым и неуправляемным кодом.
public ref class MarshalAsAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Parameter | System.AttributeTargets.ReturnValue, Inherited=false)]
public sealed class MarshalAsAttribute : Attribute
[System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Parameter | System.AttributeTargets.ReturnValue, Inherited=false)]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class MarshalAsAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Parameter | System.AttributeTargets.ReturnValue, Inherited=false)>]
type MarshalAsAttribute = class
inherit Attribute
[<System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Parameter | System.AttributeTargets.ReturnValue, Inherited=false)>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type MarshalAsAttribute = class
inherit Attribute
Public NotInheritable Class MarshalAsAttribute
Inherits Attribute
- Наследование
- Атрибуты
Примеры
В следующем примере применяется MarshalAsAttribute к полю, параметру метода и возвращаемого значения метода в управляемом типе.
using System;
using System.Text;
using System.Runtime.InteropServices;
class Program
{
//Applied to a parameter.
public void M1([MarshalAs(UnmanagedType.LPWStr)]String msg) {}
//Applied to a field within a class.
class MsgText {
[MarshalAs(UnmanagedType.LPWStr)]
public String msg = "Hello World";
}
//Applied to a return value.
[return: MarshalAs(UnmanagedType.LPWStr)]
public String GetMessage()
{
return "Hello World";
}
static void Main(string[] args)
{ }
}
Imports System.Runtime.InteropServices
Module Module1
Sub Main()
End Sub
'Applied to a parameter.
Public Sub M1(<MarshalAsAttribute(UnmanagedType.LPWStr)> ByVal msg As String)
msg = msg + "Goodbye"
End Sub
'Applied to a field within a class.
Class MsgText
<MarshalAsAttribute(UnmanagedType.LPWStr)> Public msg As String
End Class
'Applied to a return value.
Public Function M2() As <MarshalAsAttribute(UnmanagedType.LPWStr)> String
Return "Hello World"
End Function
End Module
В следующем примере атрибут применяется к свойству MarshalAsAttribute :
decimal _money;
public decimal Money
{
[return: MarshalAs(UnmanagedType.Currency)]
get { return this._money; }
[param: MarshalAs(UnmanagedType.Currency)]
set { this._money = value; }
}
Dim _money As Decimal
Public Property Money As <MarshalAs(UnmanagedType.Currency)> Decimal
Get
Return Me._money
End Get
Set(<MarshalAs(UnmanagedType.Currency)> value As Decimal)
Me._money = value
End Set
End Property
Комментарии
Этот атрибут можно применить к параметрам, полям или возвращаемым значениям.
Этот атрибут является необязательным, так как каждый тип данных имеет поведение маршалинга по умолчанию. Этот атрибут необходим только в том случае, если заданный тип можно маршалировать в несколько типов. Например, можно маршалировать строку в неуправляемый код как aLPStr, a, a LPWStrLPTStrили aBStr. По умолчанию среда CLR маршалирует строковый параметр в качестве BStr com-методов. Атрибут можно применить MarshalAsAttribute к отдельному полю или параметру, чтобы эта конкретная строка была маршалирована LPStr как не a BStr. Tlbexp.exe (экспортер библиотек типов) передает параметры маршалинга в среду CLR.
Некоторые параметры и возвращаемые значения имеют другое поведение маршалинга по умолчанию при использовании с com-взаимодействием или вызовом платформы. По умолчанию среда выполнения маршалирует строковый параметр (и поля в типе значения) в качестве LPStr метода или функции вызова платформы. Дополнительные сведения см. в разделе "Поведение маршалинга по умолчанию".
В большинстве случаев атрибут просто определяет формат неуправляемых данных с помощью UnmanagedType перечисления, как показано в следующей сигнатуре C#:
public void SomeMethod([MarshalAs(UnmanagedType.LPStr)] String s)
Public Sub SomeMethod(<MarshalAs(UnmanagedType.LPStr)> s As String)
Для некоторых UnmanagedType элементов перечисления требуются дополнительные сведения. Например, при необходимости UnmanagedTypeтребуется LPArray дополнительная информация. Полное описание использования этого атрибута с массивами см. в разделе Маршалинг по умолчанию для массивов.
Tlbimp.exe (импорт библиотек типов) также применяет этот атрибут к параметрам, полям и возвращаемым значениям, чтобы указать, что тип данных в библиотеке входных типов не является типом по умолчанию для соответствующего управляемого типа данных. Tlbimp.exe всегда применяется MarshalAsAttribute к String и Object типам для ясности независимо от типа, указанного в библиотеке входных типов.
Note
Не MarshalAsAttribute поддерживает маршалинг универсальных типов.
Конструкторы
| Имя | Описание |
|---|---|
| MarshalAsAttribute(Int16) |
Инициализирует новый экземпляр MarshalAsAttribute класса с указанным UnmanagedType значением. |
| MarshalAsAttribute(UnmanagedType) |
Инициализирует новый экземпляр MarshalAsAttribute класса с указанным UnmanagedType элементом перечисления. |
Поля
| Имя | Описание |
|---|---|
| ArraySubType |
Указывает тип элемента неуправляемого LPArray или ByValArray. |
| IidParameterIndex |
Указывает индекс параметров неуправляемого |
| MarshalCookie |
Предоставляет дополнительные сведения для пользовательского маршалера. |
| MarshalType |
Указывает полное имя пользовательского маршалера. |
| MarshalTypeRef |
MarshalType Реализуется как тип. |
| SafeArraySubType |
Указывает тип элемента объекта SafeArray. |
| SafeArrayUserDefinedSubType |
Указывает определяемый пользователем тип SafeArrayэлемента . |
| SizeConst |
Указывает количество элементов в массиве фиксированной длины или количество символов (не байтов) в строке для импорта. |
| SizeParamIndex |
Указывает отсчитываемый от нуля параметр, содержащий количество элементов массива, аналогичное |
Свойства
| Имя | Описание |
|---|---|
| TypeId |
При реализации в производном классе получает уникальный идентификатор для этого Attribute. (Унаследовано от Attribute) |
| Value |
UnmanagedType Возвращает значение, которое данные необходимо маршалировать как. |
Методы
| Имя | Описание |
|---|---|
| Equals(Object) |
Возвращает значение, указывающее, равен ли этот экземпляр указанному объекту. (Унаследовано от Attribute) |
| GetHashCode() |
Возвращает хэш-код для этого экземпляра. (Унаследовано от Attribute) |
| GetType() |
Возвращает Type текущего экземпляра. (Унаследовано от Object) |
| IsDefaultAttribute() |
При переопределении в производном классе указывает, является ли значение этого экземпляра значением по умолчанию для производного класса. (Унаследовано от Attribute) |
| Match(Object) |
При переопределении в производном классе возвращает значение, указывающее, равен ли этот экземпляр указанному объекту. (Унаследовано от Attribute) |
| MemberwiseClone() |
Создает неглубокую копию текущей Object. (Унаследовано от Object) |
| ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
Явные реализации интерфейса
| Имя | Описание |
|---|---|
| _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Сопоставляет набор имен соответствующему набору идентификаторов диспетчеризации. (Унаследовано от Attribute) |
| _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Извлекает сведения о типе объекта, который можно использовать для получения сведений о типе для интерфейса. (Унаследовано от Attribute) |
| _Attribute.GetTypeInfoCount(UInt32) |
Возвращает количество предоставляемых объектом интерфейсов для доступа к сведениям о типе (0 или 1). (Унаследовано от Attribute) |
| _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Предоставляет доступ к свойствам и методам, предоставляемым объектом. (Унаследовано от Attribute) |