10

私はMEFを使用しており、MEFがプラグインを見つける別の方法でプラグインの場所のURLを変更する方法を探しています。この行を変更したいです

Assembly.LoadFrom(@"C:\julia\project\project.Plugin.Nav\bin\Debug\NavPlugin.dll")));

アプリケーションを別のマシンにデプロイする必要があるため、この URL を削除したい

これは私の機能です:

public void AssembleCalculatorComponents()
{
   try
   {
       //var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
       //var container = new CompositionContainer(catalog);
       //container.ComposeParts(this);
       var catalog = new AggregateCatalog();

       catalog.Catalogs.Add(new AssemblyCatalog(Assembly.LoadFrom(@"C:\yosra\project\project.Plugin.Nav\bin\Debug\NavPlugin.dll")));
       var container = new CompositionContainer(catalog);

       container.ComposeParts(this);
    }
    catch (Exception ex)
    {
       throw ex;
    }
 }

手伝ってくれませんか?

ありがとう

4

4 に答える 4

16

DirectoryCatalogクラスを使用して、MEF で特定のディレクトリをスキャンして、インポートを満たすアセンブリを探すことができます。

var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog("."));
var container = new CompositionContainer(catalog);

上記は、AppDomain がアセンブリを検索するために使用するベース ディレクトリ (通常、構成で変更されない限り、実行可能ファイルを保持するディレクトリ) を集約カタログに追加します。必須ではありませんが、おそらく現在実行中のアセンブリを追加することもできます。

var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
catalog.Catalogs.Add(new DirectoryCatalog("."));
var container = new CompositionContainer(catalog);

DirectoryCatalog の MSDN の詳細: http://msdn.microsoft.com/en-us/library/system.componentmodel.composition.hosting.directorycatalog.aspx

于 2012-06-11T20:28:22.670 に答える
5

こんにちは、返信ありがとうございます。私の問題はプラグインを直接ロードすることだったので、ディレクトリを作成し、プラグインをこのフォルダーに配置したので、この解決策を見つけました

public void AssembleCalculatorComponents()
        {


            string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins");
            Console.WriteLine(path);
            //Check the directory exists
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
            Console.WriteLine(path);
            string assemblyName = Assembly.GetEntryAssembly().FullName;
            Console.WriteLine(assemblyName);
            //Create an assembly catalog of the assemblies with exports
            var catalog = new AggregateCatalog(
                new AssemblyCatalog(Assembly.GetExecutingAssembly().Location),
                new AssemblyCatalog(Assembly.Load(assemblyName)),
                new DirectoryCatalog(path, "*.dll"));

            //Create a composition container
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this);

これが私の解決策です。

于 2012-06-13T13:08:59.887 に答える
2

2 つのオプション。

  1. 現在のディレクトリをプラグインのルートとして使用します。Environment.CurrentDirectory は正しい方向を示しているはずです。
  2. app.config を使用して、プラグインを格納するディレクトリを指定します。
于 2012-06-11T20:25:59.700 に答える
1

メソッドがインスタンス化されるタイプを認識している場合は、私の *Domain* ライブラリに典型的な のプロパティ使用できAssemblyます。それ以外の場合は、 を使用できます。私は特に好きではありませんか...: TypeAssembly.GetExecutingAssembly()GetExecutingAssembly()GetCallingAssembly()

  public void AssembleCalculatorComponents() {
     try {
        var asmCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
     // OR
        asmCatalog = new AssemblyCatalog(typeof(TObject).Assembly); // replace TObject with object's actual type
        var aggregateCatalog = new AggregateCatalog(asmCatalog);
        // 
        AddDirectoryCatalogs(aggregateCatalog.Catalogs));
        var container = new CompositionContainer(catalog);

        // assuming this class has the member(s) to be composed.
        container.ComposeParts(this);
     } catch (Exception ex) {
        throw ex;
     }
  } 

それとは別に、app.configファイル、シリアル化されたディレクトリのリストなどのいずれかによって、DirectoryCatalogs を追加できますapp.config。次に、次を使用していると仮定しますSettings

private readonly Settings settings = Settings.Default;

void AddDirectoryCatalogs(ICollection<ComposablePartCatalog> Catalogs agrCatalogs ) {
    agrCatalogs.Add(new DirectoryCatalog(settings.DefaultPath, settings.DefaultPattern));
    // add more directory catalogs
}

を検索パスとして使用"."することは、実行中のアセンブリのディレクトリへの正当なショートカットですが、すべてのアセンブリがパーツを満たすために検索されることに注意してください (つまり、一致するImport/Exportオブジェクト)。特定のパターンを使用することをお勧めします。Microsoft の例は、ベストプラクティスとして知られていません。プラグインの末尾に が付くことが予想される場合はPlugin.dll、その部分を検索パターンに含めます。

于 2012-06-11T20:33:40.250 に答える