可直接複製到本機結構中的類型和非直接複製到本機結構中的類型

http://msdn.microsoft.com/zh-cn/windows/hardware/75dwhxf7(v=vs.71)

大多數數據類型在託管和非託管內存中都有公共的表示形式,而不需要 Interop 封送拆收器的特殊處理。 因爲這些類型在託管和非託管代碼之間傳遞時不需要轉換,因此稱爲“可直接複製到本機結構中的類型”。

從平臺調用返回的結構必須爲可直接複製到本機結構中的類型。 平臺調用不支持將非直接複製到本機結構中的結構作爲返回類型。

下列來自 System 命名空間的類型爲可直接複製到本機結構中的類型:

下列複雜類型也是可直接複製到本機結構中的類型:

  • 可直接複製到本機結構中的類型的一維數組,如整數數組。 但是,包含可直接複製到本機結構中的類型的變量數組的類型本身不可直接複製到本機結構中。

  • 只包含可直接複製到本機結構中的類型(如果它們被作爲格式化類型封送,則還包含類)的格式化值類型。 有關格式化值類型的更多信息,請參見 值類型的默認封送處理

對象引用不可直接複製到本機結構中。 其中包含一組對象引用,它們本身可直接複製到本機結構中。 例如,您可以定義一個可直接複製到本機結構中的結構,但是您不能定義包含對這些結構的一組引用的可直接複製到本機結構中的類型。

作爲一種優化方式,在進行封送處理的過程中,可直接複製到本機結構中的類型的數組和只包含可直接複製到本機結構中的成員的類被 鎖定,而不是被複制。 在調用方和被調用方位於同一單元中時,這些類型可能看上去是被作爲 In/Out 參數封送的。 但是,這些類型實際上是作爲 In 形參封送的,而如果要將實參作爲 In/Out 形參封送,則必須應用InAttribute 和 OutAttribute 特性。

某些託管數據類型在非託管環境中需要採用一種不同的表示形式。 必須將這些非直接複製到本機結構中的數據類型轉換爲可進行封送的格式。 例如,託管字符串是非直接複製到本機結構中的類型,這是因爲它們必須轉換爲字符串對象才能進行封送。

下表列出了 System 命名空間中的非直接複製到本機結構中的類型。 委託(它是引用靜態方法或類實例的數據結構)也是非直接複製到本機結構中的。

非直接複製到本機結構中的類型

說明

System.Array

轉換爲 C 樣式數組或 SAFEARRAY

System.Boolean

轉換爲 1、2 或 4 字節的值,值爲 true 時爲 1 或 -1。

System.Char

轉換爲 Unicode 或 ANSI 字符。

System.Class

轉換爲類接口。

System.Object

轉換爲變量或接口。

System.Mdarray

轉換爲 C 樣式數組或 SAFEARRAY

System.String

轉換爲以 null 引用或 BSTR 引用終止的字符串。

System.Valuetype

轉換爲具有固定內存佈局的結構。

System.Szarray

轉換爲 C 樣式數組或 SAFEARRAY

類和對象類型只受 COM 互操作支持。 有關 Visual Basic 2005、C# 和 C++ 中的相應類型,請參見 .NET Framework 類庫概述


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章