0

私は、さまざまな方法、つまり電子メール、ftp を使用してファイルを転送できる Windows サービスを作成しています。各ファイルまたはファイルセットには、独自の構成の詳細を含めることができます。

生成後に配信する必要があるすべてのファイルまたはファイルセットに対して、フォルダーにドロップできるアセンブリを作成すると、サービスは次のスケジュールされた実行でそれを取得します。このアセンブリは、ファイルまたはファイルセットの配信方法を定義する標準インターフェイスを利用します。これらのプラグイン アセンブリは、他の依存アセンブリ (プラグイン アセンブリをドロップする必要があるフォルダーにも含める必要がある外部 ftp ライブラリまたは電子メール ライブラリ) を参照する必要がある場合があります。

私の質問:プラグイン アセンブリが存在するフォルダー内の依存アセンブリを無視する方法はありますか? または、プラグイン アセンブリを 1 つのフォルダーに整理し、依存アセンブリを別々に整理する方法はありますか?

これは、サービスがアセンブリをループする私のコードです。現在、フォルダー内にあるすべてのものを使用し、おそらく例外をスローします。

foreach (var file in Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ConfigurationManager.AppSettings["AssemblyStorage"])))
{
      var assembly = Assembly.LoadFrom(file);

      Type type = assembly.GetType("ReflectionTest.Plugin");

      if (type != null)
      {
          object obj = Activator.CreateInstance(type);
          var resultFtp = type.InvokeMember("FTP", BindingFlags.Default | BindingFlags.InvokeMethod, null,obj, null);
          var resultEmail = type.InvokeMember("Email",BindingFlags.Default | BindingFlags.InvokeMethod,null, obj, null);

          Console.Write(resultFtp);
          Console.Write(resultEmail);

          obj = null;
      }

      assembly = null;
      type = null;

}

プラグイン アセンブリ:コンパイルされたプラグイン dll は、最終的に上記のフォルダーに配置されます - (Path.Combine(AppDomain.CurrentDomain.BaseDirectory,ConfigurationManager.AppSettings["AssemblyStorage"]). これらのプラグイン アセンブリ ファイルの名前は何でもかまいません。

namespace ReflectionTest
{
    public class Plugin : ITransferService
    {
        public bool FTP()
        {
            return true;
        }

        public bool Email()
        {
            return true;
        }
    }
}
4

1 に答える 1

0

オプション 1. プラグイン アセンブリを特別な属性でマークし、すべての型を列挙する前にチェックすることができます。アセンブリに属性を配置するには、そのアセンブリの任意のコード ファイルに次のように記述できます。

[assembly:YourSpecialAttributeClass]

オプション 2. アセンブリを別のフォルダーに分離し、AppDomain.AssemblyResolve イベントにフックして、プラグインと依存関係フォルダーで必要なアセンブリを手動で検索することもできます。

于 2013-08-20T13:01:48.313 に答える