C#とC++の相互運用のための属性の設定方法

C#からC++のコードにアクセスするためには、カスタム属性を使用して関数や構造体の挙動を調整する必要があります。

DllImport属性

DLLエントリポイントを定義する外部関数を示します。

[ DllImport( DLL名 ) ]
属性のパラメータ
パラメータ 説明 既定値
EntryPoint DLL内の関数の名前  
CharSet 文字列のマーシャリング方法を示すCharSet列挙 CharSet.Auto
SetLastError Win32エラー情報を維持するか? false
ExactSpelling EntryPointの関数名を厳密に一致させるか? false
PreserveSig 定義通りのメソッドのシグネチャを維持するか?  
CallingConvention EntryPointで使用するモードを指定するCallingConvention列挙 StdCall

サンプルコード

[DllImport( "test.dll", EntryPoint = "MethodName" )]
public static void MethodName( int x );

StructLayout属性

クラスまたは構造体のデータメンバを、メモリ内でどのように配置するかを表わします。

[ StructLayout( LayoutKind列挙 ) ]
LayoutKind列挙体
メンバ 説明
Sequential 宣言される順番に従って並べる
Explicit FieldOffsetAttributeで独自のオフセットを指定して並べる
Auto 適切なレイアウトで並べる
(マネージコードの外からアクセスできない)
属性のパラメータ
パラメータ 説明 既定値
Pack

パックサイズを指定するint値

指定可能な値は[ 1, 2, 4, 8, 16]のいずれか

8
CharSet 文字列のマーシャリング方法を示すCharSet列挙 CharSet.Auto
Size 構造体またはクラスのサイズを指定  

サンプルコード

[StructLayout( LayoutKind.Sequential )]
public struct Position
{
    public double x;
    public double y;
    public double z;
}

CLSCompliant属性

CLSへの準拠を検証するかどうかをコンパイラに指示します。

外部から参照できない型やメンバに、この属性を指定する必要はありません。指定すると「このアセンブリの外から認識できないため、CLS 準拠の確認は '型' で実行されません」と警告が表示されます。

サンプルコード

[CLSCompliant( false )]
public int SetValue( UInt32 value );
※ この場合UInt32型はCLSに準拠しないため、CLSCompliant(false)と指定する必要があります。

SuppressUnmanagedCodeSecurity属性

アンマネージコードの呼び出し時に実行されたスタックウォークを実行時に省き、効率を大幅に向上させます。SuppressUnmanagedCodeSecurityAttribute クラス - MSDN

In属性とOut属性

データのマーシャリングの方法を指示します。

属性 説明
In属性 呼び出し側にデータをマーシャリングして渡すことを示す
Out属性 呼び出し元にデータをマーシャリングして戻すことを示す