- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2021-05-14T00:10:59+00:00","default:admin","admin")
#author("2021-05-14T00:43:31+00:00","default:admin","admin")
-[[Microsoft Visual C++ - Wikipedia:https://ja.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B]]
-[[C#からC++のDLLを呼び出す:https://araramistudio.jimdo.com/2018/05/09/c-%E3%81%8B%E3%82%89c-%E3%81%AEdll%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99/]]
-[[【C++/C#】C++で作成したDLLをC#で呼ぶ:https://qiita.com/tera1707/items/81042abaa62dc97e26ae]]
*C++で作成したDLLをC#から利用する際の注意点 [#y2097e4e]
**プラットフォームターゲットを合わせる [#g2774c1c]
-x86(32ビット)で作成されたDLLは、x64(64ビット)のアプリケーションからは使用できない
-同様にx64(64ビット)で作成されたDLLは、x86(32ビット)のアプリケーションからは使用できない
-故に、プラットフォームターゲットは合わせる必要がある
**[DllImport]で関数を定義する [#ccaf292c]
-DLLで提供される関数を、DllImport属性を使ってC#のソース内に定義する
-使用するDLLファイルはEXEファイルと同じフォルダにコピーしておく
**呼び出し規約を明示 [#o6e52b92]
-呼び出す側のアプリと呼び出される側の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);
}
**文字列のマーシャリング [#o16918d8]
-C#では文字列をstring型で扱いますが、C++では通常 char型の配列(もしくはwchar_t型の配列)が使われる
-このため、DLLへ文字列を渡す場合、パラメータは char型ポインタとなっている
-C#ではマーシャリングという機能が働くため、char型ポインタを string型へ置き換えて定義する事が出来るようになっている
-文字列を渡す場合
--C#で使用するには、char*型をstring型に置き換えて定義
-文字列を受け取る場合
--DLLから文字列を受け取る場合は StringBuilderクラスを使用
-文字コードは自動変換してくれる