動的にDLLファイルのクラスメソッドを呼び出す (C#4.0のdynamic型を用いたアセンブリの動的呼び出し)

アセンブリのクラスメソッド(DLLファイル)を動的に呼び出したい場合があります。こちらではReflection(リフレクション)機能を用いてクラスメソッドを呼び出せる例を紹介しました。C#4.0以降では dynamic型が新たに追加され、これを用いるとさらに簡単に動的にクラスのメソッドを呼び出せます。

プログラムコード

CalcClass.cs (呼び出されるライブラリ側)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleLib
{
  public class CalcClass
  {
    public int Add(int a, int b)
    {
      return a + b;
    }
  }
}

Form1.cs (呼び出し側)

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

namespace DynamicLoad
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
    }
    private void button3_Click(object sender, EventArgs e)
    {
      Assembly asm = Assembly.LoadFrom("SimpleLib.dll");
      dynamic instance = Activator.CreateInstance(asm.GetType("SimpleLib.CalcClass"));
      int r = instance.Add(2, 3);

      textBox1.Text = Convert.ToString(r);

    }
  }
}

説明

Assembly asm = Assembly.LoadFrom("SimpleLib.dll");
でアセンブリをロードします。

dynamic instance = Activator.CreateInstance(asm.GetType("SimpleLib.CalcClass"));
Activator.CreatorInstanceメソッドを用いてアセンブリ内にあるCalcClassクラスのインスタンスを作成します。
int r = instance.Add(2, 3);
作成されたインスタンスからメソッドを呼び出します。
textBox1.Text = Convert.ToString(r);
メソッドの戻り値をテキストボックスに表示します。

dynamic型を用いるとType.GetMethod()メソッドなどでメソッド情報(MethodInfo)を取得せずに済みます。また、dynamic型を使わない場合は、Invokeメソッドを呼び出してメソッドを呼び出していましたが、通常のクラスのように、インスタンスの後ろに.をつける形で、インスタンスからメソッドを呼び出す形で記述できます。
動的にロード、生成したクラスでも通常のクラスと同じ記述スタイルでメソッドを呼び出すことができます。但し、dynamic型を用いた場合はdynamic型が決定されるのは実行中になるため、コード記述時にはソースコード補完機能は働きません。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2010-06-24
iPentec all rights reserverd.