C++で作成されたDLLをC#でコントロールするソフトを作成しているけど、どうもイマイチしっくりこない。 基本的なことが解っていないためだと思うので、自前でDLLを作ってみて、それをC#でコントロールしてみようと思う。
C++は、40年以上前にPC-8001上で動くコンパイラで遊んで以来だから、ほぼ忘れている。
という訳で、簡単なコードを見よう見まねで書いてみた。
Visual Studio 2022を使った。
DLLのプロジェクトを立ち上げると、デフォルトでdllmain.cppとpch.cppとういソースファイルと、faramework.hとpch.hというヘッダファイルが生成される。
それはそのまま置いておいて、新たにヘッダファイルとソースファイルを作る。 今回は、DLLが作成できるかどうか試すだけなので、全くシンプルに関数一つだけにした。
1 2 3 4 |
#pragma once #define Dll_Test_CPP_API __declspec(dllexport) extern "C" Dll_Test_CPP_API void Add(int a, int b, int* c); |
1 2 3 4 5 6 7 8 9 |
#include "pch.h" #include <stdio.h> #include <stdlib.h> #include "Dll_Test_CPP.h" void Add(int a, int b, int* c) { *c = a + b; } |
int型の引数2つを加えて、答えをint型のポインタ変数に返すという単純な関数にした。 全然C++じゃないけど..。
これでbuildすると、プロジェクトのDebugホルダーにDll_Test_CPP.dllが作成された。
次に、C#のWindowsフォームアプリケーション(.NET Framework)プロジェクトを作成し、そのDebugホルダーに上で作成したDLLファイルをコピーした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace DllTestAPISharp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } [DllImport("Dll_Test_CPP.dll", CallingConvention = CallingConvention.Cdecl)] private extern static void Add(int x, int y, out int z); private void button1_Click(object sender, EventArgs e) { textBox1.Text = "void add(int a, int b, int* c)\r\n"; int a; int b; int c; a = 1; b = 2; Add(a, b, out c); textBox1.Text = textBox1.Text + a.ToString() + " + " + b.ToString() + " = " + c.ToString() + "\r\n"; } } } |
実行結果。 ちゃんと動作しているみたい。
int型のポインタに対しては、参照渡しをしてやれば良い。
次回は、もう少し複雑なやつをやってみたい。