2009年11月12日木曜日20:28:00

DLLを読込み、そのDLL内にある指定のインターフェースを継承しているクラスを作成して、そのクラスのメソッドを実行する

長いタイトルだな・・・。

久しぶりにブログを書く。twitterでは、よくつぶやいているんだけどね。久しぶりのブログだけど、近況報告とかではなく、プログラミングのメモ。例外処理とか考えていない。

簡単な流れ

  1. フォルダ内のdllパスを取得する
  2. dllパスから、アセンブリを読込む
  3. アセンブリ内の型をすべて取得する
  4. 型が、クラスで、publicで、抽象型ではなく、指定のインターフェースが継承されているか調べる
  5. 当てはまれば、その型のオブジェクトを作成する
  6. 型の数だけ、dllの数だけ繰り返す
  7. 作成されたオブジェクトのメソッドを実行

メインプログラムの一部

    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 コメント

コメントを投稿する

0 件のコメント:

コメントを投稿

top