プロジェクトを作成する
ファイルから「新規作成」→「プロジェクト」を選択します。

今回はC#のコンソールアプリを選択して「Csharp_call_Cplus」としてプロジェクトを作成します。

次にC++のプロジェクトも作成しておきます。今回は「CplusProject」として作成しておきます。

これでC#とC++のプロジェクトができました。

ファイルの作成
つぎにファイルを用意していきます。まずはC++のプロジェクトを右クリックし、追加、新しい項目からヘッダファイルを選択して「CplusProject.h」と入力してヘッダファイルを作成します。

次もC++のプロジェクトを右クリックし、追加、新しい項目からC++ファイルを選択して「CplusProject.cpp」と入力してソースファイルを作成します。

ソースファイルの編集
ソースファイルを編集していきましょう。まずは「CplusProject.h」に以下の内容を書きます。とくに意識するのは戻り値の部分とメソッドの部分だけでいいかと思います。それ以外は必要になったら編集する感じで。
1 2 3 4 5 6 |
#pragma once extern "C" { __declspec(dllexport) int __stdcall Test(int x,int y); } |
次に「CplusProject.cpp」を編集します。今回の内容は以下の通りとします。まず、TestメソッドでInt型の引数x,yを受け取ると、コンソールに”The C function has been called.”と表示します。次にXとYの掛け算を行ってreturnでC#の呼び出し元に結果を戻します。今回は非常に簡単なプログラムにしています。
1 2 3 4 5 6 7 8 |
#include <iostream> #include "CplusProject.h" extern "C" __declspec(dllexport) int __stdcall Test(int x, int y) { std::cout << "The C function has been called." << std::endl; return x * y; } |
次に呼び出し元となる「Program.cs」を編集します。C#側では8、9行目の記述をすることでC++側のメソッドが呼び出せるようになります。16行目でC++側のメソッドを呼び出してInt型の「result」に結果を格納しています。最後にコンソールで結果を表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System.Runtime.InteropServices; using System; namespace Application { internal class Program { [DllImport("CplusProject.dll")] static extern int Test(int x,int y); static void Main() { int x = 10; int y = 20; int result = Test(x, y); Console.WriteLine("result = " + result); } } } |
プロパティの設定
ファイル構成が適切になるようにプロジェクトのプロパティを設定しておきます。まずはC++のプロジェクトを右クリックしてプロパティから以下の項目を設定します。C++側はDLLで出力したいので、構成の種類はダイナミックライブラリ(.dll)を選択して置きます。DLLの出力ディレクトリはC#の「.exe」ファイルが出力される場所を指定しておきます。実行時の構成に合わせてDebug、Releseの両方の設定を行っておきます。


次にC#側のプロパティの設定も確認しておきます。私のPCは64bitなので以下のチェックを外しておきます。


構成マネージャーの設定
次に「構成マネージャー」を開いて以下の設定を確認しておきます。Any CPUを選んでおくと32bit、64bitのどちらでも使えるようになるみたいです。詳しくはないのでこちらは他の情報をご参照ください。


プログラムの実行
以上の設定でビルドを実施するとを以下のような構成でファイルが出力されるはずです。debugモードでビルドしたときは「Debug」フォルダの中に「CplusProject.dll」と「Csharp_call_Cplus.exe」が格納されています。DLLファイルが出力されない場合はソリューションのクリーンを行ってから再度ビルドしてみてください。

Releseモードでビルドしたときは「Relese」フォルダの中に「CplusProject.dll」と「Csharp_call_Cplus.exe」が格納されます。

プログラムの実行
プログラムを実行してC#からC++のメソッドを呼び出してみましょう。今回はコンソールが一瞬で消えてしまうと結果を確認できないので、今回は「Ctrl+F5」で実行します。

コンソールにC++のファイルの内容が表示されれば、C#からC++のメソッドを呼び出せたことを確認できます。

コメントを残す