.NET Framework環境下で、Reflectionを使えば、動的にアセンブリを読み込んで、その内部のメソッドを呼び出すことが可能であることは知っていました。
しかし、何となく面倒そうという先入観があったのと、チャレンジする暇がないという理由で、やや敬遠していました。
ですが、いざ試しに書いてみると、あっさり動いてしまいました。引数リストがオブジェクトの配列になることと、戻り値が常にobject型になっている点を除けば、何ら面倒なところはありませんね。(いや、実用上はそこが面倒という話はありますが……。それこそが、最も敬遠したい理由というのは嘘ではないでしょう)
以下は、実験したスパイクのソースです。Visual Studio.NET 2003 (C#)用。
呼び出し側(コンソールアプリケーション) §
using System;
using System.Reflection;
namespace reflection001
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Assembly asm = Assembly.LoadFrom(@"..\..\..\reflectionTarget001\bin\debug\reflectionTarget001.dll");
Type type = asm.GetType("ReflectionTarget001.Target");
object result = type.InvokeMember("Sample", BindingFlags.InvokeMethod|BindingFlags.Public|BindingFlags.Static,
null,null,new string[1] { "hello!" } );
Console.WriteLine(result);
}
}
}
呼ばれる側(クラスライブラリ) §
using System;
namespace ReflectionTarget001
{
public class Target
{
public static string Sample( string s )
{
return "[" + s + "]";
}
}
}
実行結果 §
[hello!]