ホームに戻る
出典 :
【C#】C#で作成したDLLをC#で呼ぶ(静的/動的) - Qiita
関連 :
C#からC++のDLLを呼び出す C#におけるusing
目次 :

C#によるライブラリ(DLL)の作成と結合

C#(.NET)ではDLLを動的にも静的にも結合することができ、C++と比較してその手順は簡便である。
以下、Visual Studioを用いた場合の手順を示す。

呼ばれる側(DLL)の作成

  1. 新しいプロジェクトとして、「クラス ライブラリ」を作成する。
  2. 空のクラスが作成される。
  3. 任意の処理を実装し、ビルドを行う。
    以下実装例。
    namespace ClassLibrary1 { public class Class1 { // - = - = - = - = - = - = - = - = - = - // private メンバ // - = - = - = - = - = - = - = - = - = - // データリスト private List<MyData> list_Data = new List<MyData>(); // - = - = - = - = - = - = - = - = - = - // public メソッド // - = - = - = - = - = - = - = - = - = - // [static]足し算を行う public static int Add(int a, int b) => a + b; // データリストにデータを追加する public int AddMyData(MyData data) { if (data != null) { list_Data.Add(data); } return list_Data.Count; } // 指定されたインデクスのデータを返す public MyData DataSearch(int serachIndex) => list_Data.FirstOrDefault(x => x.index == serachIndex); } // 試験用データ public class MyData { public int index; public double data; } }

呼ぶ側 - 静的結合

以下の手順により、アセンブリ(DLLまたはEXE)の内容を参照することができる。
  1. プロジェクトを開き、ソリューション エクスプローラ上でプロジェクトを右クリック、
    「追加」>「プロジェクト参照」を選択する。
  2. 左ペインで「参照」を選択し、ボタン「参照」を押す。
  3. 呼び出すアセンブリを選択する。
  4. 3. で選択したアセンブリ(の名前空間)が「依存関係」>「アセンブリ」下に追加されれば成功。

呼ぶ側 - 動的結合

動的に結合することも可能。
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace CSharpConsole { class Program { static void Main(string[] args) { var asm = Assembly.LoadFrom("CSharpDll.dll"); //< アセンブリ(CSharpDll.dll)の読み込み var module = asm.GetModule("CSharpDll.dll"); //< アセンブリ(CSharpDll.dll)からモジュールを取得 var Person = module.GetType("CSharpDll.Person"); //< モジュール中の利用するクラス(or 構造体)を取得 // ^^^^^^^^^ ^^^^^^ // ↑ ↑ // 名前空間 │ // クラス if (Person != null) { // CSharpDll.Personクラスをインスタンス化 // (コンストラクタへ引数を渡すことも可能) dynamic p1 = Activator.CreateInstance(Person, "Aiueo", 29); // ^^^^^^^ ^^^^^^^^^^ // ↑ ↑ // クラス │ // コンストラクタ引数 Console.WriteLine($"name= {p1.Name}"); Console.WriteLine($"age= {p1.Age}"); Console.WriteLine(p1.ToString()); } Console.ReadKey(); } } }