#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クラスを使用 -文字コードは自動変換してくれる