C++で作成したDLLをC#から利用する際の注意点

プラットフォームターゲットを合わせる

  • x86(32ビット)で作成されたDLLは、x64(64ビット)のアプリケーションからは使用できない
  • 同様にx64(64ビット)で作成されたDLLは、x86(32ビット)のアプリケーションからは使用できない
  • 故に、プラットフォームターゲットは合わせる必要がある

[DllImport?]で関数を定義する

  • DLLで提供される関数を、DllImport?属性を使ってC#のソース内に定義する
  • 使用するDLLファイルはEXEファイルと同じフォルダにコピーしておく

呼び出し規約を明示

  • 呼び出す側のアプリと呼び出される側のDLLとで、呼び出し規約が一致していないといけない
  • C#では呼び出し規約の規定値は "Winapi" となっている
  • "Winapi" はOSによって規約が変化し、Windows では "StdCall?" 、Windows ce.NET では "Cdecl" となる
  • C#側で規約を明示する場合
    public class Test
    {
        [DllImport("DLLTest.dll", CallingConvention = CallingConvention.StdCall)]
        private extern static int DLLTest_A(int a, double b); 
    }

文字列のマーシャリング

  • C#では文字列をstring型で扱いますが、C++では通常 char型の配列(もしくはwchar_t型の配列)が使われる
  • このため、DLLへ文字列を渡す場合、パラメータは char型ポインタとなっている
  • C#ではマーシャリングという機能が働くため、char型ポインタを string型へ置き換えて定義する事が出来るようになっている
  • 文字列を渡す場合
    • C#で使用するには、char*型をstring型に置き換えて定義
  • 文字列を受け取る場合
    • DLLから文字列を受け取る場合は StringBuilder?クラスを使用
  • 文字コードは自動変換してくれる

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-05-14 (金) 09:43:31 (1077d)