長いタイトルだな・・・。
久しぶりにブログを書く。twitterでは、よくつぶやいているんだけどね。久しぶりのブログだけど、近況報告とかではなく、プログラミングのメモ。例外処理とか考えていない。
簡単な流れ
- フォルダ内のdllパスを取得する
- dllパスから、アセンブリを読込む
- アセンブリ内の型をすべて取得する
- 型が、クラスで、publicで、抽象型ではなく、指定のインターフェースが継承されているか調べる
- 当てはまれば、その型のオブジェクトを作成する
- 型の数だけ、dllの数だけ繰り返す
- 作成されたオブジェクトのメソッドを実行
メインプログラムの一部
public class HelloDLL
{
static public string Hello ()
{
string dll_file_path = Path.Combine( Directory.GetCurrentDirectory(), "dll" );
List<ITest> i_test = new List<ITest>(); // 作成したオブジェクトを格納
if ( !Directory.Exists( dll_file_path ) )
{
return "プラグインフォルダ\"" + dll_file_path + "\"が見つかりませんでした。";
}
// dllフォルダの、dllファイルのパスを取得
string[] dll_s = Directory.GetFiles( dll_file_path, "*.dll" );
foreach ( string dll in dll_s )
{
System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom( dll );
foreach ( Type _type in asm.GetTypes() )
{
if ( _type.IsClass && _type.IsPublic && !( _type.IsAbstract ) &&
_type.GetInterface( typeof( ITest ).FullName ) != null )
{
i_test.Add( (ITest)asm.CreateInstance( _type.FullName ) );
}
}
}
var sb = new StringBuilder();
foreach ( ITest it in i_test )
{
sb.Append( it.Hello() ); // 作成したオブジェクトのメソッド実行
sb.Append( "\r\n" );
}
return sb.ToString();
}
}
インターフェース
public interface ITest
{
string Hello ();
}
dll内クラスの一例
public class Class1 : TestInterface.ITest
{
#region ITest メンバ
public string Hello ()
{
return "Hello 1";
}
#endregion
}
実行結果
Hello 1
Hello 2
Hello 3
続行するには何かキーを押してください . . .