初心者向けプログラミング解説になります。
今回は、C++で作成したDLLを、C#のEXEで実行する手順までまとめましたので、ご参考ください。
前回のあらすじ
前回は、C++でDLLを作成したものを、VB.NETのEXEで使ってみたところまで実践しました。
実践
今回は、C++でDLLを作成したものを、C#のEXEで使ってみます。
※DLLは前回のをそのまま使います。
exe(C#)の作成手順
呼び側の作成(Windows フォーム アプリケーション(.NET Framework))になります。
- 新しいプロジェクトの作成→ 言語の種類「C#」を選択します。
- Windows フォーム アプリケーション(.NET Framework)を選択。
- プロジェクト名「csharpapp_cdll」とします。
- 「構成マネージャー」を選択して「x64」を新規作成します。
(DLLは「x64」で作成しましたので、EXE側も「x64」で作成します。)
- 「x64」を選択した状態で
- 「開始」をクリックします。
- ビルドが実行され、のっぺらぼうの画面が表示されました。
- これで準備は整いました。「×」ボタンを押してForm1画面を閉じます。
- exeファイルと同じ場所(ここではcsharpapp_cdll > bin > x64 > Debug)に、dllファイルを置きます。
- フォームにボタンとラベルを追加します。
- ボタンをダブルクリックして以下プログラムを入力します。
- Form1.csファイル内に以下プログラムを入力します。
- DLLの関数を利用可能にするための定義
[System.Runtime.InteropServices.DllImport("cdll.dll")]
public static extern int functest();
- ボタン押下時にDLLの関数を呼びます。
label1.Text = functest().ToString();
- 「開始」ボタンで実行します。
- 「Button1」ボタンをクリックすると、ラベルに「10」と表示されます。
その前に、下記エラーが表示されると思いますので、修正してお試しください。
もし、こんなエラーが出たら1
エラー1
指定されたモジュールが見つかりません。 (0x8007007E)
このエラーが出たら、dllファイルがexeと同じ場所に置いていないと表示されます。
上記の手順通り実施していれば、このエラーは出ません。
もし、こんなエラーが出たら2
エラー2
間違ったフォーマットのプログラムを読み込もうとしました。 (0x8007000B)
このエラーが出たら、dllとexeが、両方とも64ビット(x64)になっていないと表示されます。
上記の手順通り実施していれば、このエラーは出ません。
もし、こんなエラーがでたら3
エラー3
DLL ‘cdll.dll’ の ‘functest’ というエントリ ポイントが見つかりません。
dll側のエクスポートがうまくいっていないのが原因になります。
functest()が本当に定義されているか。
前回、C++のexeでお試し済みなら、これは無いですね。
「extern “C”」を使っているか、もしくは、defファイルを作成してビルドしているか。
「extern “C”」のほうが簡単で、今後追加したときの漏れの心配もないので、こちらを採用します。
VB.NETときも解説済みですが念のためご参考ください。
cdll.hを以下のように修正しました。
修正したdllファイルをexeと同じフォルダにコピーして(上書きして)、お試しください。
最後に
- exeを実行すると、「Button1」ボタンをクリックすると、ラベルに「10」と表示されました。
以上で、C言語DLLを、C#のEXEで使用する方法になります。
構成マネージャーを「Debug」で進めましたが、納品するようなときは、「Release」でビルドしたファイルを渡しましょう。
ファイルサイズも小さくなって、いろいろ最適化されてますので、処理速度も上がります。
次回は、また別の言語に変えて試した解説を行いたいと思います。
最後まで見てくれてありがとう。