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