C#でも当然、C言語やC++と同様、DLLにリンクし、エクスポートされている関数を呼び出すことが可能です。むしろ、C#での関数呼び出しの方が、容易です。本投稿では、C# Windows フォームアプリケーションから、クラスライブラリ(DLL)にリンクする流れを解説します。
実行環境は下表の通りです。
開発環境 | Microsoft Visual Studio Community 2019 Version 16.11.7 |
OS | Windows 10 バージョン21H1 |
DLLリンクまでの流れ
まず、前提条件となりますが、今回用意するDLLは、C#で作られたクラスライブラリDLLとなります。C言語で作られたDLLもC#で呼び出すことは可能ですが、それは別投稿で説明します。今回の流れは以下の通りです。
(1)C#のクラスライブラリを用意する
ライブラリ名は『TestClass.dll』とします。コンストラクタとメソッドhogeを実装します。具体的には、後に記載します。
(2)C#のWindows フォームアプリケーションを作成する
フォームは以下のような画面とします。ボタンを1つだけ付け、クリックのイベントハンドラ内で(1)のクラスライブラリ内メソッドを呼び出します。
それでは、コードです。
クラスライブラリを用意する
クラスライブラリ側は、ごく単純に以下の通り、実装します。Visual Studioでビルドを行うと、”TestClass.dll”が生成されます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
// Formから別DLLにリンクするテストコード
// TestClass.dllというDLLができます。
namespace TestClass
{
public class Class1
{
// コンストラクタ
public Class1()
{ // コンストラクタが実行されたことを確認するためにメッセージボックスを表示
MessageBox.Show("コンストラクタ実行", "ヘッダータイトル");
}
// メソッドhoge
public void hoge()
{ // メソッドhogeの確認用にメッセージボックスを表示
MessageBox.Show("hoge", "ヘッダータイトル");
}
}
}
C#のWindows フォームアプリケーションを作成する
Windows フォームアプリケーションは以下のように実装します。
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 TestClass; // リンクテスト用のテストDLL
namespace TestForm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Button1_Click_1(object sender, EventArgs e)
{
// テストクラスのインスタンスを生成
Class1 cs = new Class1();
// DLL側のメソッドがCALLできることの確認。
cs.hoge();
}
}
}
上記コードを作成すると、『TestClass』の名前解決ができていないため、ビルドは失敗します。名前解決するためには、Windows フォームアプリケーション側のプロジェクトで、”参照”を右クリックし、以下の参照マネージャーから参照設定を行います。
設定後、以下の通りDLLが参照追加されていればokです。
ここまで設定できたら、Windows フォームのプロジェクトをビルドしておきます。
動作確認
ビルドしてできたWindows フォームを起動後、『フォーム起動』ボタンをクリックすると、クラスライブラリ側に実装したクラスのコンストラクタ、メソッドhogeが実行されることを確認できます。
まとめ
Windowsフォームアプリケーションから、別に用意されたクラスライブラリのDLLにリンクできることを確認しました。
Windows フォームなどの画面に限りませんが、複雑であったり、高度な処理を用意する場合、後の保守性や拡張性を考慮して、ビジネスロジックを別オブジェクトに分離しておくことが多いです。
ポイントは、“呼び出し側のプロジェクトにて参照設定を行うこと”になりますが、画面を作成する段階で、今回のように静的に参照設定するケースは少ないかもしれません。プロジェクトの別部隊から提供されたDLLオブジェクトに、動的にリンクするのがほとんどだと思います。
コメント