MarshalAsAttribute 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
表示如何在 Managed 和 Unmanaged 程式碼之間封送處理資料。
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 套用至 Managed 型別中的欄位、方法參數和方法傳回值。
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
備註
您可以將此屬性套用至參數、欄位或傳回值。
這個屬性是選擇性的,因為每個數據類型都有預設封送處理行為。 只有當指定的型別可以封送處理至多個類型時,才需要這個屬性。 例如,您可以將字串封送處理至 Unmanaged 程式代碼,做為 LPStr、、 LPWStr、 LPTStr或 BStr。 根據預設,Common Language Runtime 會將字串參數封送處理為 BStr COM 方法的 。 您可以將 屬性套用 MarshalAsAttribute 至個別欄位或參數,讓該特定字串封送處理為, LPStr 而不是 BStr。 Tlbexp.exe (類型庫導出工具) 將您的封送處理喜好設定傳遞至 Common Language Runtime。
搭配 COM Interop 或平台調用使用時,某些參數和傳回值有不同的預設封送處理行為。 根據預設,運行時間會將實值類型中的字串參數 (和欄位封送處理為 LPStr 平台調用方法或函式的) 。 如需詳細資訊,請參閱 預設封送處理行為。
在大部分情況下,屬性只會使用 UnmanagedType 列舉來識別 Unmanaged 數據的格式,如下列 C# 簽章所示:
public void SomeMethod([MarshalAs(UnmanagedType.LPStr)] String s)
Public Sub SomeMethod(<MarshalAs(UnmanagedType.LPStr)> s As String)
某些 UnmanagedType 列舉成員需要其他資訊。 例如,當 為 LPArray時UnmanagedType,需要其他資訊。 如需如何搭配陣列使用此屬性的完整描述,請參閱 數位的預設封送處理。
Tlbimp.exe (類型庫匯入工具) 也會將此屬性套用至參數、欄位和傳回值,以指出輸入類型庫中的數據類型不是對應 Managed 數據類型的預設類型。 不論輸入類型連結庫中指定的型別為何,Tlbimp.exe 一律會 MarshalAsAttribute 套用 至 String 和 Object 型別。
注意
MarshalAsAttribute不支援泛型類型的封送處理。
建構函式
MarshalAsAttribute(Int16) |
使用指定的 UnmanagedType 值,初始化 MarshalAsAttribute 類別的新執行個體。 |
MarshalAsAttribute(UnmanagedType) |
使用指定的 MarshalAsAttribute 列舉型別 (Enumeration) 成員,初始化 UnmanagedType 類別的新執行個體。 |
欄位
ArraySubType |
指定 Unmanaged LPArray 或 ByValArray 的元素型別。 |
IidParameterIndex |
指定 COM 所使用之 Unmanaged |
MarshalCookie |
提供其他資訊給自訂封送處理器。 |
MarshalType |
指定自訂封送處理器的完整名稱。 |
MarshalTypeRef |
實作 MarshalType 為型別。 |
SafeArraySubType |
指示 SafeArray 的元素型別。 |
SafeArrayUserDefinedSubType |
指示 SafeArray 的使用者定義的元素型別。 |
SizeConst |
指示固定長度陣列中的元素數目或要匯出之字串中的字元數目 (非位元組)。 |
SizeParamIndex |
指示哪一個以零起始的參數含有陣列元素的計數,類似 COM 中的 |
屬性
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) |
將一組名稱對應至一組對應的分派識別項 (Dispatch Identifier)。 (繼承來源 Attribute) |
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
擷取物件的類型資訊,可以用來取得介面的類型資訊。 (繼承來源 Attribute) |
_Attribute.GetTypeInfoCount(UInt32) |
擷取物件提供的類型資訊介面數目 (0 或 1)。 (繼承來源 Attribute) |
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
提供物件所公開的屬性和方法的存取權。 (繼承來源 Attribute) |