#author("2021-05-14T00:22:32+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クラスを使用

-文字コードは自動変換してくれる

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS