2009年11月12日木曜日20:28:00
DLLを読込み、そのDLL内にある指定のインターフェースを継承しているクラスを作成して、そのクラスのメソッドを実行する
長いタイトルだな・・・。
久しぶりにブログを書く。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 続行するには何かキーを押してください . . .
0 件のコメント:
コメントを投稿