配列に対する既定のマーシャリングDefault Marshaling for Arrays

全体がマネージド コードで構成されるアプリケーションでは、共通言語ランタイムは、配列型を In/Out パラメーターとして渡します。In an application consisting entirely of managed code, the common language runtime passes array types as In/Out parameters. これに対し、相互運用マーシャラーは、既定で In パラメーターとして配列を渡します。In contrast, the interop marshaler passes an array as In parameters by default.

ピン留め最適化を使用すると、同じアパートメント内のオブジェクトと対話するときに、blittable 配列を In/Out パラメーターとして操作しているように見せることができます。With pinning optimization, a blittable array can appear to operate as an In/Out parameter when interacting with objects in the same apartment. ただし、後でコードをコンピューター間のプロキシを生成するために使用されるタイプ ライブラリにエクスポートし、そのライブラリがアパートメント間で呼び出しをマーシャリングするために使用される場合は、呼び出しで In パラメーターの動作を true に戻すことができます。However, if you later export the code to a type library used to generate the cross-machine proxy, and that library is used to marshal your calls across apartments, the calls can revert to true In parameter behavior.

配列は本質的に複雑で、マネージド配列とアンマネージド配列間の違いが、他の非 blittable 型より多くの情報を保証します。Arrays are complex by nature, and the distinctions between managed and unmanaged arrays warrant more information than other non-blittable types.

マネージド配列Managed Arrays

マネージド配列型は異なっても、System.Array クラスはすべての配列型の基底クラスです。Managed array types can vary; however, the System.Array class is the base class of all array types. System.Array クラスには、ランク、長さ、および配列の下限と上限を決定するためのプロパティに加え、配列のアクセス、並べ替え、検索、コピー、および作成するためのメソッドがあります。The System.Array class has properties for determining the rank, length, and lower and upper bounds of an array, as well as methods for accessing, sorting, searching, copying, and creating arrays.

これらの配列型は動的で、基底クラス ライブラリで定義されている対応する静的型はありません。These array types are dynamic and do not have a corresponding static type defined in the base class library. 要素型とランクのそれぞれの組み合わせを配列の別個の型として考えると便利です。It is convenient to think of each combination of element type and rank as a distinct type of array. このため、整数の 1 次元配列の型は double 型の 1 次元配列の型とは異なります。Therefore, a one-dimensional array of integers is of a different type than a one-dimensional array of double types. 同様に、整数の 2 次元配列は整数の 1 次元配列とは異なります。Similarly a two-dimensional array of integers is different from a one-dimensional array of integers. 型を比較するときに、配列の境界は考慮されません。The bounds of the array are not considered when comparing types.

次の表に示すように、マネージド配列の任意のインスタンスは、特定の要素の型、ランク、および下限があります。As the following table shows, any instance of a managed array must be of a specific element type, rank, and lower bound.

マネージド配列型Managed array type 要素型Element type 順位Rank 下限Lower bound シグネチャの表記Signature notation
ELEMENT_TYPE_ARRAYELEMENT_TYPE_ARRAY 型で指定。Specified by type. ランクで指定。Specified by rank. 必要に応じて境界で指定。Optionally specified by bounds. type [ n,m ]type [ n,m ]
ELEMENT_TYPE_CLASSELEMENT_TYPE_CLASS 不明Unknown 不明Unknown 不明Unknown System.ArraySystem.Array
ELEMENT_TYPE_SZARRAYELEMENT_TYPE_SZARRAY 型で指定。Specified by type. 11 00 type [ n ]type [ n ]

アンマネージ配列Unmanaged Arrays

アンマネージ配列は、COM スタイルのセーフ配列または固定長または可変長の C スタイルの配列です。Unmanaged arrays are either COM-style safe arrays or C-style arrays with fixed or variable length. セーフ配列は、関連付けられた配列データの型、ランク、および境界を格納する自己記述型の配列です。Safe arrays are self-describing arrays that carry the type, rank, and bounds of the associated array data. C スタイル配列は下限が 0 に固定された 1 次元型の配列です。C-style arrays are one-dimensional typed arrays with a fixed lower bound of 0. マーシャリング サービスには、両方の配列型の制限されたサポートがあります。The marshaling service has limited support for both types of arrays.

.NET コードへの配列パラメーターの引き渡しPassing Array Parameters to .NET Code

C スタイル配列とセーフ配列は、どちらもセーフ配列または C スタイル配列としてアンマネージ コードから .NET コードに渡すことができます。Both C-style arrays and safe arrays can be passed to .NET code from unmanaged code as either a safe array or a C-style array. 次の表に、アンマネージ型の値とインポートされた型を示します。The following table shows the unmanaged type value and the imported type.

アンマネージ型Unmanaged type インポートされた型Imported type
SafeArray( Type )SafeArray( Type ) ELEMENT_TYPE_SZARRAY < ConvertedType >ELEMENT_TYPE_SZARRAY < ConvertedType >

ランク = 1、下限 = 0。Rank = 1, lower bound = 0. サイズはマネージド シグネチャで指定された場合にのみ判明します。Size is known only if provided in the managed signature. ランク = 1 または下限 = 0 ではないセーフ配列は、SZARRAY としてマーシャリングできません。Safe arrays that are not rank = 1 or lower bound = 0 cannot be marshaled as SZARRAY.
Type []Type [] ELEMENT_TYPE_SZARRAY < ConvertedType >ELEMENT_TYPE_SZARRAY < ConvertedType >

ランク = 1、下限 = 0。Rank = 1, lower bound = 0. サイズはマネージド シグネチャで指定された場合にのみ判明します。Size is known only if provided in the managed signature.

セーフ配列Safe Arrays

セーフ配列がタイプ ライブラリから .NET アセンブリにインポートされるときに、配列は既知の型 (int など) の 1 次元配列に変換されます。When a safe array is imported from a type library to a .NET assembly, the array is converted to a one-dimensional array of a known type (such as int). パラメーターに適用される同じ型変換規則は、配列要素にも適用されます。The same type conversion rules that apply to parameters also apply to array elements. たとえば、BSTR 型のセーフ配列は文字列のマネージド配列になり、バリアントのセーフ配列はオブジェクトのマネージド配列になります。For example, a safe array of BSTR types becomes a managed array of strings and a safe array of variants becomes a managed array of objects. SAFEARRAY 要素型はタイプ ライブラリからキャプチャされ、UnmanagedType 列挙型の SAFEARRAY 値に保存されます。The SAFEARRAY element type is captured from the type library and saved in the SAFEARRAY value of the UnmanagedType enumeration.

セーフ配列のランクと境界はタイプ ライブラリからは判断できないため、ランクは 1 に等しく下限は 0 に等しいと見なされます。Because the rank and bounds of the safe array cannot be determined from the type library, the rank is assumed to equal 1 and the lower bound is assumed to equal 0. ランクと境界は、タイプ ライブラリ インポーター (Tlbimp.exe) によって生成されるマネージド シグネチャで定義する必要があります。The rank and bounds must be defined in the managed signature produced by the Type Library Importer (Tlbimp.exe). 実行時にメソッドに渡されるランクが異なる場合、SafeArrayRankMismatchException がスローされます。If the rank passed to the method at run time differs, a SafeArrayRankMismatchException is thrown. 実行時に渡される配列の型が異なる場合、SafeArrayTypeMismatchException がスローされます。If the type of the array passed at run time differs, a SafeArrayTypeMismatchException is thrown. 次の例は、マネージド コードとアンマネージド コードでのセーフ配列を示しています。The following example shows safe arrays in managed and unmanaged code.

アンマネージ シグネチャUnmanaged signature

HRESULT New1([in] SAFEARRAY( int ) ar);  
HRESULT New2([in] SAFEARRAY( DATE ) ar);  
HRESULT New3([in, out] SAFEARRAY( BSTR ) *ar);  

マネージド シグネチャManaged signature

Sub New1(<MarshalAs(UnmanagedType.SafeArray, SafeArraySubType:=VT_I4)> _  
   ar() As Integer)  
Sub New2(<MarshalAs(UnmanagedType.SafeArray, SafeArraySubType:=VT_DATE)> _   
   ar() As DateTime)  
Sub New3(ByRef <MarshalAs(UnmanagedType.SafeArray, SafeArraySubType:=VT_BSTR)> _   
   ar() As String)  
void New1([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VT_I4)] int[] ar) ;  
void New2([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VT_DATE)]   
   DateTime[] ar);  
void New3([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VT_BSTR)]   
   ref String[] ar);  

多次元配列 (0 以外の値にバインドされたセーフ配列) は、Tlbimp.exe によって生成されたメソッド シグネチャが、ELEMENT_TYPE_SZARRAY ではなく ELEMENT_TYPE_ARRAY の要素型を示すように変更された場合に、マネージド コードにマーシャリングできます。Multidimensional, or nonzero-bound safe arrays, can be marshaled into managed code if the method signature produced by Tlbimp.exe is modified to indicate an element type of ELEMENT_TYPE_ARRAY instead of ELEMENT_TYPE_SZARRAY. または、Tlbimp.exe で /sysarray スイッチを使用してすべての配列を System.Array オブジェクトとしてインポートできます。Alternatively, you can use the /sysarray switch with Tlbimp.exe to import all arrays as System.Array objects. 渡される配列が多次元配列だとわかっている場合は、Tlbimp.exe で生成された Microsoft Intermediate Language (MSIL) コードを編集してから再コンパイルすることができます。In cases where the array being passed is known to be multidimensional, you can edit the Microsoft intermediate language (MSIL) code produced by Tlbimp.exe and then recompile it. MSIL コードの変更方法の詳細については、「Customizing Runtime Callable Wrappers」(ランタイム呼び出し可能ラッパーのカスタマイズ) を参照してください。For details about how to modify MSIL code, see Customizing Runtime Callable Wrappers.

C スタイル配列C-Style Arrays

C スタイル配列がタイプ ライブラリから .NET アセンブリにインポートされると、その配列は ELEMENT_TYPE_SZARRAY に変換されます。When a C-style array is imported from a type library to a .NET assembly, the array is converted to ELEMENT_TYPE_SZARRAY.

配列要素型は、タイプ ライブラリから決定され、インポート中は保持されます。The array element type is determined from the type library and preserved during the import. パラメーターに適用される同じ変換規則は、配列の要素にも適用されます。The same conversion rules that apply to parameters also apply to array elements. たとえば、LPStr 型の配列は、String 型の配列になります。For example, an array of LPStr types becomes an array of String types. Tlbimp.exe は配列要素型をキャプチャし、MarshalAsAttribute 属性をパラメーターに適用します。Tlbimp.exe captures the array element type and applies the MarshalAsAttribute attribute to the parameter.

配列ランクは 1 と等しいと見なされます。The array rank is assumed to equal 1. ランクが 1 より大きい場合、配列は 1 次元配列として列優先順でマーシャリングされます。If the rank is greater than 1, the array is marshaled as a one-dimensional array in column-major order. 下限は常に = 0 です。The lower bound always equals 0.

タイプ ライブラリには、固定長または可変長の配列を含めることができます。Type libraries can contain arrays of fixed or variable length. Tlbimp.exe は、タイプ ライブラリから固定長配列のみをインポートできます。これは、タイプ ライブラリに可変長配列をマーシャリングするために必要な情報が不足しているためです。Tlbimp.exe can import only fixed-length arrays from type libraries because type libraries lack the information needed to marshal variable-length arrays. 固定長配列では、サイズはタイプ ライブラリからインポートされ、パラメーターに適用される MarshalAsAttribute でキャプチャされます。With fixed-length arrays, the size is imported from the type library and captured in the MarshalAsAttribute that is applied to the parameter.

次の例に示すように、可変長配列を含むタイプ ライブラリを手動で定義する必要があります。You must manually define type libraries containing variable-length arrays, as shown in the following example.

アンマネージ シグネチャUnmanaged signature

HRESULT New1(int ar[10]);  
HRESULT New2(double ar[10][20]);  
HRESULT New3(LPWStr ar[10]);  

マネージド シグネチャManaged signature

Sub New1(<MarshalAs(UnmanagedType.LPArray, SizeConst=10)> _  
   ar() As Integer)  
Sub New2(<MarshalAs(UnmanagedType.LPArray, SizeConst=200)> _  
   ar() As Double)  
Sub New2(<MarshalAs(UnmanagedType.LPArray, _  
   ArraySubType=UnmanagedType.LPWStr, SizeConst=10)> _  
   ar() As String)  
void New1([MarshalAs(UnmanagedType.LPArray, SizeConst=10)] int[] ar);  
void New2([MarshalAs(UnmanagedType.LPArray, SizeConst=200)] double[] ar);  
void New2([MarshalAs(UnmanagedType.LPArray,   
   ArraySubType=UnmanagedType.LPWStr, SizeConst=10)] String[] ar);  

インターフェイス定義言語 (IDL) ソース内の配列に size_is 属性または length_is 属性を適用してサイズをクライアントに伝達することができますが、Microsoft インターフェイス定義言語 (MIDL) コンパイラはその情報をタイプ ライブラリに伝達しません。Although you can apply the size_is or length_is attributes to an array in Interface Definition Language (IDL) source to convey the size to a client, the Microsoft Interface Definition Language (MIDL) compiler does not propagate that information to the type library. サイズがわからないと、相互運用マーシャリング サービスが配列要素をマーシャリングできません。Without knowing the size, the interop marshaling service cannot marshal the array elements. その結果、可変長配列は参照引数としてインポートされます。Consequently, variable-length arrays are imported as reference arguments. (例:For example:

アンマネージ シグネチャUnmanaged signature

HRESULT New1(int ar[]);  
HRESULT New2(int ArSize, [size_is(ArSize)] double ar[]);  
HRESULT New3(int ElemCnt, [length_is(ElemCnt)] LPStr ar[]);  

マネージド シグネチャManaged signature

Sub New1(ByRef ar As Integer)  
Sub New2(ByRef ar As Double)  
Sub New3(ByRef ar As String)  
void New1(ref int ar);    
void New2(ref double ar);    
void New3(ref String ar);   

Tlbimp.exe によって生成された Microsoft Intermediate Language (MSIL) コードを編集して、マーシャラーに配列サイズを提供してから再コンパイルすることができます。You can provide the marshaler with the array size by editing the Microsoft intermediate language (MSIL) code produced by Tlbimp.exe and then recompiling it. MSIL コードの変更方法の詳細については、「Customizing Runtime Callable Wrappers」(ランタイム呼び出し可能ラッパーのカスタマイズ) を参照してください。For details about how to modify MSIL code, see Customizing Runtime Callable Wrappers. 配列内の要素の数を示すには、次の方法のいずれかの方法で、MarshalAsAttribute 型をマネージド メソッド定義の配列パラメーターに適用します。To indicate the number of elements in the array, apply the MarshalAsAttribute type to the array parameter of the managed method definition in one of the following ways:

  • 配列内の要素数を含む別のパラメーターを特定します。Identify another parameter that contains the number of elements in the array. パラメーターは位置によって識別され、最初のパラメーターは番号 0 から始まります。The parameters are identified by position, starting with the first parameter as number 0.

    Sub [New](ElemCnt As Integer, _  
       \<MarshalAs(UnmanagedType.LPArray, SizeParamIndex:=1)> _  
       ar() As Integer)  
    
    void New(  
       int ElemCnt,   
       [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)] int[] ar );  
    
  • 配列のサイズを定数として定義します。Define the size of the array as a constant. (例:For example:

    Sub [New](\<MarshalAs(UnmanagedType.LPArray, SizeConst:=128)> _  
       ar() As Integer)  
    
    void New(  
       [MarshalAs(UnmanagedType.LPArray, SizeConst=128)] int[] ar );  
    

アンマネージド コードからマネージド コードに配列をマーシャリングする場合、マーシャラーはパラメーターに関連付けられた MarshalAsAttribute をチェックして配列サイズを決定します。When marshaling arrays from unmanaged code to managed code, the marshaler checks the MarshalAsAttribute associated with the parameter to determine the array size. 配列サイズが指定されていない場合は、1 つの要素のみがマーシャリングされます。If the array size is not specified, only one element is marshaled.

注意

MarshalAsAttribute は、マネージド配列のアンマネージド コードへのマーシャリングには影響しません。The MarshalAsAttribute has no effect on marshaling managed arrays to unmanaged code. その方向では、配列サイズは検査で決定されます。In that direction, the array size is determined by examination. マネージド配列のサブセットをマーシャリングする方法はありません。There is no way to marshal a subset of a managed array.

相互運用マーシャラーは、CoTaskMemAlloc メソッドと CoTaskMemFree メソッドを使用してメモリの割り当てと取得を行います。The interop marshaler uses the CoTaskMemAlloc and CoTaskMemFree methods to allocate and retrieve memory. アンマネージ コードによって実行されるメモリの割り当てでは、これらのメソッドも使用する必要があります。Memory allocation performed by unmanaged code must also use these methods.

COM への配列の引き渡しPassing Arrays to COM

すべてのマネージド配列型は、マネージド コードからアンマネージド コードに渡すことができます。All managed array types can be passed to unmanaged code from managed code. 次の表に示すように、マネージド型とそれに適用される属性に応じて、セーフ配列または C スタイル配列として配列にアクセスできます。Depending on the managed type and the attributes applied to it, the array can be accessed as a safe array or a C-style array, as shown in the following table.

マネージド配列型Managed array type エクスポートExported as
ELEMENT_TYPE_SZARRAY < type >ELEMENT_TYPE_SZARRAY < type > UnmanagedType .SafeArray( type )UnmanagedType .SafeArray( type )

UnmanagedType.LPArrayUnmanagedType.LPArray

型はシグネチャで提供されます。Type is provided in the signature. ランクは常に 1 で、下限は常に 0 です。Rank is always 1, lower bound is always 0. サイズは実行時に常に把握されています。Size is always known at run time.
ELEMENT_TYPE_ARRAY < type > < rank > [ < bounds > ]ELEMENT_TYPE_ARRAY < type > < rank >[< bounds >] UnmanagedType.SafeArray( type )UnmanagedType.SafeArray( type )

UnmanagedType.LPArrayUnmanagedType.LPArray

型、ランク、境界はシグネチャで提供されます。Type, rank, bounds are provided in the signature. サイズは実行時に常に把握されています。Size is always known at run time.
ELEMENT_TYPE_CLASS < System.Array >ELEMENT_TYPE_CLASS <System.Array> UT_InterfaceUT_Interface

UnmanagedType.SafeArray( type )UnmanagedType.SafeArray( type )

型、ランク、境界、およびサイズは実行時に常に把握されています。Type, rank, bounds, and size are always known at run time.

LPSTR または LPWSTR を含む構造体の配列に関連する OLE オートメーションの制限があります。There is a limitation in OLE Automation relating to arrays of structures that contain LPSTR or LPWSTR. そのため、String フィールドは UnmanagedType.BSTR としてマーシャリングする必要があります。Therefore, String fields have to be marshaled as UnmanagedType.BSTR. この操作を行わない場合、例外がスローされます。Otherwise, an exception will be thrown.

ELEMENT_TYPE_SZARRAYELEMENT_TYPE_SZARRAY

ELEMENT_TYPE_SZARRAY パラメーター (1 次元配列) を含むメソッドが .NET アセンブリからタイプ ライブラリにエクスポートされるときに、配列パラメーターが特定の型の SAFEARRAY に変換されます。When a method containing an ELEMENT_TYPE_SZARRAY parameter (one-dimensional array) is exported from a .NET assembly to a type library, the array parameter is converted to a SAFEARRAY of a given type. 同じ変換規則が配列要素型に適用されます。The same conversion rules apply to the array element types. マネージド配列の内容はマネージド メモリから SAFEARRAY に自動的にコピーされます。The contents of the managed array are automatically copied from managed memory into the SAFEARRAY. (例:For example:

マネージド シグネチャManaged signature

Sub [New](ar() As Long)  
Sub [New](ar() As String)  
void New(long[] ar );  
void New(String[] ar );  

アンマネージ シグネチャUnmanaged signature

HRESULT New([in] SAFEARRAY( long ) ar);
HRESULT New([in] SAFEARRAY( BSTR ) ar);  

セーフ配列のランクは常に 1 で、下限は常に 0 です。The rank of the safe arrays is always 1 and the lower bound is always 0. サイズは実行時に渡されるマネージド配列のサイズによって決まります。The size is determined at run time by the size of the managed array being passed.

MarshalAsAttribute 属性を使用することで、配列を C スタイル配列としてマーシャリングすることもできます。The array can also be marshaled as a C-style array by using the MarshalAsAttribute attribute. (例:For example:

マネージド シグネチャManaged signature

Sub [New](<MarshalAs(UnmanagedType.LPArray, SizeParamIndex:=1)> _  
   ar() As Long, size as Integer)  
Sub [New](<MarshalAs(UnmanagedType.LPArray, SizeParamIndex:=1)> _  
   ar() As String, size as Integer)  
Sub [New](<MarshalAs(UnmanagedType.LPArray, _  
   ArraySubType= UnmanagedType.LPStr, SizeParamIndex:=1)> _  
   ar() As String, size as Integer)  
void New([MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)]   
   long [] ar, int size );  
void New([MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)]   
   String [] ar, int size );  
void New([MarshalAs(UnmanagedType.LPArray, ArraySubType=   
   UnmanagedType.LPStr, SizeParamIndex=1)]   
   String [] ar, int size );  

アンマネージ シグネチャUnmanaged signature

HRESULT New(long ar[]);
HRESULT New(BSTR ar[]);
HRESULT New(LPStr ar[]);  

マーシャラーには配列をマーシャリングするために必要な長さ情報がありますが、配列の長さは通常、呼び出し先に長さを伝えるために個別の引数として渡されます。Although the marshaler has the length information needed to marshal the array, the array length is usually passed as a separate argument to convey the length to the callee.

ELEMENT_TYPE_ARRAYELEMENT_TYPE_ARRAY

ELEMENT_TYPE_ARRAY パラメーターを含むメソッドが .NET アセンブリからタイプ ライブラリにエクスポートされるときに、配列パラメーターが特定の型の SAFEARRAY に変換されます。When a method containing an ELEMENT_TYPE_ARRAY parameter is exported from a .NET assembly to a type library, the array parameter is converted to a SAFEARRAY of a given type. マネージド配列の内容はマネージド メモリから SAFEARRAY に自動的にコピーされます。The contents of the managed array are automatically copied from managed memory into the SAFEARRAY. (例:For example:

マネージド シグネチャManaged signature

Sub [New](ar(,) As Long)  
Sub [New](ar(,) As String)  
void New( long [,] ar );  
void New( String [,] ar );  

アンマネージ シグネチャUnmanaged signature

HRESULT New([in] SAFEARRAY( long ) ar);
HRESULT New([in] SAFEARRAY( BSTR ) ar);  

セーフ配列のランク、サイズ、およ境界は、マネージド配列の特性によって実行時に決定されます。The rank, size, and bounds of the safe arrays are determined at run time by the characteristics of the managed array.

MarshalAsAttribute 属性を適用することで、配列を C スタイル配列としてマーシャリングすることもできます。The array can also be marshaled as a C-style array by applying the MarshalAsAttribute attribute. (例:For example:

マネージド シグネチャManaged signature

Sub [New](<MarshalAs(UnmanagedType.LPARRAY, SizeParamIndex:=1)> _  
   ar(,) As Long, size As Integer)  
Sub [New](<MarshalAs(UnmanagedType.LPARRAY, _  
   ArraySubType:=UnmanagedType.LPStr, SizeParamIndex:=1)> _  
   ar(,) As String, size As Integer)  
void New([MarshalAs(UnmanagedType.LPARRAY, SizeParamIndex=1)]   
   long [,] ar, int size );  
void New([MarshalAs(UnmanagedType.LPARRAY,   
   ArraySubType= UnmanagedType.LPStr, SizeParamIndex=1)]   
   String [,] ar, int size );  

アンマネージ シグネチャUnmanaged signature

HRESULT New(long ar[]);
HRESULT New(LPStr ar[]);  

入れ子にされた配列をマーシャリングすることはできません。Nested arrays cannot be marshaled. たとえば、次のシグネチャをタイプ ライブラリ エクスポーター (Tlbexp.exe) を使用してエクスポートすると、エラーが発生します。For example, the following signature generates an error when exported with the Type Library Exporter (Tlbexp.exe).

マネージド シグネチャManaged signature

Sub [New](ar()()() As Long)  
void New(long [][][] ar );  

ELEMENT_TYPE_CLASS <System.Array>ELEMENT_TYPE_CLASS <System.Array>

System.Array パラメーターを含むメソッドが .NET アセンブリからタイプ ライブラリにエクスポートされるときに、配列パラメーターが特定の型の _Array インターフェイスに変換されます。When a method containing a System.Array parameter is exported from a .NET assembly to a type library, the array parameter is converted to an _Array interface. マネージド配列の内容には、 _Array インターフェイスのメソッドとプロパティを介してのみアクセスできます。The contents of the managed array are accessible only through the methods and properties of the _Array interface. MarshalAsAttribute 属性を使用することで、System.ArraySAFEARRAY としてマーシャリングすることもできます。System.Array can also be marshaled as a SAFEARRAY by using the MarshalAsAttribute attribute. セーフ配列としてマーシャリングすると、配列要素はバリアントとしてマーシャリングされます。When marshaled as a safe array, the array elements are marshaled as variants. (例:For example:

マネージド シグネチャManaged signature

Sub New1( ar As System.Array )  
Sub New2( <MarshalAs(UnmanagedType.Safe array)> ar As System.Array )  
void New1( System.Array ar );  
void New2( [MarshalAs(UnmanagedType.Safe array)] System.Array ar );  

アンマネージ シグネチャUnmanaged signature

HRESULT New([in] _Array *ar);
HRESULT New([in] SAFEARRAY(VARIANT) ar);  

構造体内の配列Arrays within Structures

アンマネージ構造体には、埋め込まれた配列を含めることができます。Unmanaged structures can contain embedded arrays. 既定では、これらの埋め込まれた配列フィールドは SAFEARRAY としてマーシャリングされます。By default, these embedded array fields are marshaled as a SAFEARRAY. 次の例では、s1 が構造体そのものに直接割り当てられている埋め込まれた配列です。In the following example, s1 is an embedded array that is allocated directly within the structure itself.

アンマネージ表現Unmanaged representation

struct MyStruct {  
    short s1[128];  
}  

UnmanagedType としてマーシャリングできる配列で、MarshalAsAttribute フィールドを設定する必要があります。Arrays can be marshaled as UnmanagedType, which requires you to set the MarshalAsAttribute field. サイズは定数としてのみ設定できます。The size can be set only as a constant. 次のコードは、MyStruct の対応するマネージド定義を示しています。The following code shows the corresponding managed definition of MyStruct.

Public Structure <StructLayout(LayoutKind.Sequential)> MyStruct  
   Public <MarshalAs(UnmanagedType.ByValArray, SizeConst := 128)> _  
     s1() As Short  
End Structure  
[StructLayout(LayoutKind.Sequential)]  
public struct MyStruct {  
   [MarshalAs(UnmanagedType.ByValArray, SizeConst=128)] public short[] s1;  
}  

関連項目See also