ソフトウェア開発では何もかも、一から作る必要はありません。
例えば前に作った機能を流用したり、他の誰かが作ったライブラリから機能を流用したりして工数の削減を図ります。
単なるソースをコピペでは、もし不具合があった場合にコピペしたすべてのソースを直す必要がでてくるリスクがあります。
そこで他のプロジェクトでも使うことができるように機能を外だししておくことも重要ではないでしょうか
DLLの作成(別プロジェクトとしてソリューションに追加)
ソリューションエクスプローラーでソリューションを右クリックして、「追加」→「新しいプロジェクト」をクリックします。

DLLを作成するためには、クラスライブラリを選択します。Windowsでのみの動作を想定しているのであれば「クラス ライブラリ(.Net Framework)」を選べばよろしいかと思います。

プロジェクト名を入力してプロジェクトを作成します。

クラスの内容を以下のようにしました。
※Formを利用したい場合は、参照で「System.Windows.Forms」を参照しないと使えません。
using System;
namespace SampleClassLibrary
{
public class SampleClass
{
public string StringProperty { get; set; } = "";
public void SampleMethod(string msg)
{
Console.WriteLine($"{this.StringProperty}:{msg}");
}
}
}
静的にDLLの読込みを行う
静的に読み込む場合は、実行前にあらかじめプロジェクトの参照で読み込むDLLを設定しておくことができます。
プロジェクトを参照する
ソリューションエクスプローラーのプロジェクトを右クリックし、参照から「参照の追加」を選択する

参照マネージャーからプロジェクトを選び、参照したいプロジェクトを選択します。

これでプロジェクト同士に依存関係ができます。
依存関係ができると、ビルド時に一緒にビルド処理が行われ、出力先にDLLファイルが自動でコピーされます。
Releaseビルドも同様にコピーされるので完成時に必要なファイルがフォルダに入っていることになります。便利ですね。
プロジェクトではなくDLLを読み込む
プロジェクトではなく別途用意したDLLを読み込む場合は、参照マネージャーで参照を選択し、「参照」ボタンをクリックします。

読み込む対象のDLLファイルを選択し、「追加」ボタンをクリックします。

ファイルを選んで追加すると参照マネージャーに追加されます。OKを押してDLLを読み込みます。

参照の設定
参照を読み込んだ側で、参照の設定をすることができます。ソリューションエクスプローラーでDLLを参照したプロジェクトの参照を開き、参照しているDLLを選択します。
DLLを選択するとプロパティが表示されるので、プロパティの内容を確認し必要であれば変更します。

この中で必要そうなものは、「ローカルにコピー」と「特定バージョン」かなと思います。
DLLをローカルにコピーせず、すでにあるDLLを利用する場合は「ローカルにコピー」をFalseにしてください。
※環境変数PATHが通っているフォルダにDLLがある場合は、必ずしも同じフォルダにDLLを置いておく必要はありません。
バージョンが上がるとDLL内の関数やプロパティが変わっていることがあります。
関数の引数の数が変わってる。関数の内容が変わってる。プロパティ名が変わってる。などなど・・・。こうなるとその関数を使っているプロジェクトでは、DLLの読込エラーになります。
通常は、ビルド時にコンパイルエラーになるので大丈夫なのですが、ビルド後にDLLを置き換えるなどが行われると読込エラーの原因になったりします。
自分で作ったDLLなら変更内容も把握できますが、他人が作ったものに関しては把握しきれない場合もあります。その時は動作ができているバージョンを必ず読み込むように「特定バージョン」をTrueにしておくとDLLの読込エラーを抑止できるかと思います。
※プロジェクトを参照した場合、特定バージョンはありません。理由はおそらく参照したことにより依存関係ができ、読込プロジェクトのビルド時に一緒にビルドされ常に最新の状態になっているからかと思います。
DLLファイル内のクラスの呼び出し
参照が完了したので実際にDLL内のクラスを呼び出します。
以下は上記に記載したクラスを利用した例です。
//クラスオブジェクトを生成
SampleClassLibrary.SampleClass sample = new SampleClassLibrary.SampleClass();
//プロパティに設定
sample.StringProperty = "サンプル";
//メソッドの呼び出し
sample.SampleMethod("テスト");
クラスを呼び出すときは、DLL内で設定されているnamespaceを使います。
namespace.class名
//例では
SampleClassLibrary.SampleClass
namespaceをusingに置けばクラス名を直接設定できます。
using SampleClassLibrary;
実行結果
サンプルを実行すると以下の結果が返りました。

まとめ
よく使う機能をDLLとして分けておくことで、プログラミングをする上で自分の資産を増やすことにもなります。
有効に活用していただけると幸いです。


コメント