見出し画像

C#からC++DLLを実行する方法

1. はじめに

1.1 C#からC++を呼び出したい

 元々作成していたC++のプログラムにGUIを追加しようとした。しかし、C++でGUIを作成するのは何かと面倒である。そこで、C#からC++をDLL化して呼び出せないか検討した。基本的な手順は参考文献が見つかったが、やってみると、結構躓づいたため、やり方をまとめることにした。

1.2 動作環境

 動作環境を以下に示す。

 OS: Windows 10
 ツール:Visual Studio 2019 Community Edition

2. C++のDLLを作成する

 まず、C++のDLLから作成する。

2.1 新規に空のプロジェクトを作成する

 Visual Studioから、ファイル→新規作成→プロジェクトを選択し、新規プロジェクトを作成する。プロジェクトは、「空のプロジェクト」で作成する。

2.2 *.cpp、*.hファイルを追加する

 任意の名前の*.cppと*.hファイルを追加する。プログラムは二つの引数を加算する関数である。

//add.h
#pragma once
#ifndef ADD_HPP
#define ADD_HPP

extern "C"
{
    __declspec(dllexport) int __stdcall add(int a, int b) {
        return a + b;
    }
}
#endif
//add.cpp

#include "add.h"

2.3 作成したC++からDLLを作成する

 C++で作成したプロジェクトからDLLを出力する。図1に示す構成の種類を「ダイナミックライブラリ(.dll)」に変更する。

図1 DLLを生成する設定

 また、DLLを作るときは、プラットフォームが32ビットか64ビットにも注意する。図2のように設定がx86(32ビット)になっているとビルドが通らない。

図2 プラットフォーム構成(32ビットの場合)
図3 プラットフォーム構成(64ビットの場合)

 今回は、図3のようにプラットフォームをx64に設定した。これでプロジェクトをビルドすると、DLLファイルを出力する。これでC++をDLL化することができた。

3. C#のプロジェクトを作成する

 次は、DLLを呼び出すC#のプロジェクトを作成する。

3.1 新規プロジェクト作成

 Visual Studioから、ソリューションプロジェクトを右クリック→追加→新しいプロジェクトを選択する。プロジェクトの種類は、Windowsフォームアプリケーションとして作成する。

 今回は、GUIを作ることが目的ある。そのため、フォームアプリケーションとして作成した(人によってはコンソールアプリでもよい)。

3.2 呼び出し処理の追加

 C#のForm.csにDLLの呼び出し部分を追加する。

using System
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

//以下を追加
using System.Runtime.InteropServices;
//ここまで

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        //以下を追加
        [DllImport(@"C:\Users\username\source\repos\Project1\WindowsFormsApp1\bin\Debug\Project1.dll", EntryPoint =
        "add", CallingConvention = CallingConvention.StdCall)]
        public static extern int add(int x, int y);
        //ここまで

        public Form1()
        {
            InitializeComponent();
            //以下を追加
            a = add(1,2);
            //ここまで
        }
    }
}

 DllImportのパスをC#の実行ファイルがあるパスにする。また、そこに作成したDLLを入れておく。その場合、実行時にはDLLを見に行く。

 DLL側でデバッグができるようにDebugモードで実行できるようにする。この設定は、ネイティブコードデバッグにチェックを付ける(図4)。

図4 ネイティブコードデバッグを有効にするチェック 

 筆者は、DLLにするとソースコードはみれないものとおもっていたが、設定次第ではDLLの中も見れるようだ。

3.3 どうやら動かない

 これで準備OKと思い、DLLを動作した。しかし、下記のエラーが発生することがわかった。

図5 予期せぬエラー

 間違ったフォーマットと書いてあるので、32ビットと64ビットの構成の違い化と察しがついた。

3.4 対象プラットフォームの設定

 色々設定を調べてみると、C#の対象プラットフォームが32ビットとなっていることが分かった。初期状態のC#は、対象プラットフォームが32ビットを選ぶにチェックが付いている。この場合、64ビット向けで作成したDLLがエラーとなるようだ。

図5 対象プラットフォームの設定 

 図6のように対象プラットフォームを64ビットに変更する。

図6 対象プラットフォームの設定

4. 実行してみよう

 実際に実行してみよう。C#のプロジェクトをデバッグ実行させる(図7)。

図7 実行結果

 図7に示すようにC#フォームアプリケーションからDLL化したC++を呼び出すことができた。めでたしめでたし。

5. おわりに

 今回は、C#からC++でDLL化したプログラムを呼び出す手順をまとめた。一番苦労したのは、32ビットでビルドしないとうまくいかなかったことである。このような使い方をするプログラムを作成する場合には注意してほしい。

参考文献

 基本的な手順は以下を参考にした。

https://learn.microsoft.com/ja-jp/visualstudio/debugger/how-to-debug-managed-and-native-code?view=vs-2022

この記事が気に入ったらサポートをしてみませんか?