動的にDLLファイルのクラスを扱う (C#4.0のdynamic型を用いた場合) - C#

C#4.0のdynamic型を利用して動的にDLLファイルのクラスを扱うコードを紹介します。

概要

動的に呼び出したメソッドからの戻り値がクラスの場合には、そのクラスを呼び出し側から扱う必要があります(メンバのアクセスやメソッドの呼び出しなど)。今回はC#4.0で加わった、dynamicを用いてクラスを動的に扱う例を紹介します。
こちらではリフレクション機能を用いて同等の処理をしていますが、dynamic型を用いた場合はリフレクションに比べ、コードがシンプルになっています。

コード

呼び出し側 FormMain.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 FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button4_Click(object sender, EventArgs e)
    {
      Assembly asm = Assembly.LoadFrom("SimpleLib.dll");
      dynamic instance = Activator.CreateInstance(asm.GetType("SimpleLib.CalcClass"));

      dynamic result = instance.GetInfo();

      textBox1.Text = Convert.ToString(result.name);
      textBox2.Text = Convert.ToString(result.value);

    }
  }
}

ライブラリ側 CalcClass.cs

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

namespace SimpleLib
{
  public class NameAndValue
  {
    public string name;
    public string value;
  }

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

    public NameAndValue GetInfo()
    {
      NameAndValue nav = new NameAndValue();
      nav.name = "SimpleLib";
      nav.value = "CalcClass";

      return nav;
    }

  }
}

説明

今回は呼び出し側からライブラリ側クラスCalcClassのGetInfo()メソッドを呼び出します。GetInfo()メソッドは戻り値がNameAndValueのクラスになっています。
まず、
Assembly asm = Assembly.LoadFrom("SimpleLib.dll");
でライブラリDLLのアセンブリを取得します。
dynamic instance = Activator.CreateInstance(asm.GetType("SimpleLib.CalcClass"));
でCalcClassのインスタンスを作成します。

dynamic result = instance.GetInfo();
で、GetInfoメソッドを呼び出します。呼び出し結果はdynamic型の変数に代入します。

textBox1.Text = Convert.ToString(result.name);
textBox2.Text = Convert.ToString(result.value);
NameAndValueクラスのメンバ(name,value)の内容を表示します。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2010-07-01
iPentec all rights reserverd.