C#からC++のコードにアクセスするためには、カスタム属性を使用して関数や構造体の挙動を調整する必要があります。
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( 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;
}
CLSへの準拠を検証するかどうかをコンパイラに指示します。
外部から参照できない型やメンバに、この属性を指定する必要はありません。指定すると「このアセンブリの外から認識できないため、CLS 準拠の確認は '型' で実行されません」と警告が表示されます。
[CLSCompliant( false )] public int SetValue( UInt32 value );
アンマネージコードの呼び出し時に実行されたスタックウォークを実行時に省き、効率を大幅に向上させます。SuppressUnmanagedCodeSecurityAttribute クラス - MSDN
データのマーシャリングの方法を指示します。
| 属性 | 説明 |
|---|---|
| In属性 | 呼び出し側にデータをマーシャリングして渡すことを示す |
| Out属性 | 呼び出し元にデータをマーシャリングして戻すことを示す |