MEF только загрузка Экспорт из локальной сборки - PullRequest
0 голосов
/ 28 февраля 2012

Я пытаюсь создать приложение, которое может динамически загружать классы, реализующие интерфейс "IPlugin", у меня есть:

        var catalog = new AssemblyCatalog(typeof(Shell).Assembly);
        var externalCatalog = new DirectoryCatalog(@".\Modules");

        var container = new CompositionContainer(catalog);


        var a = new AggregateCatalog(externalCatalog, catalog);

Но когда я пытаюсь получить экспорт:

        CompositionContainer __container = new CompositionContainer(a);
        //get all the exports and load them into the appropriate list tagged with the importmany
        __container.Compose(batch);

        var yyyy = __container.GetExports<IModule>();

Не находит мой "IPlugin" во внешней сборке "Рейсплан".


Реализация плагина "Rejseplan": (тот, который не загружается)
 namespace Rejseplan
 {

[ModuleExport(typeof(IPlugin), InitializationMode = InitializationMode.WhenAvailable)]
class RejseplanModule : IModule, IPlugin
{
     private readonly IRegionViewRegistry regionViewRegistry;

    [ImportingConstructor]
     public RejseplanModule(IRegionViewRegistry registry)
    {
        this.regionViewRegistry = registry;   
    }

    public void Initialize()
    {
        regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(Views.DepartureBoard));       
    }

    string IPlugin.Name
    {
        get { throw new NotImplementedException(); }
    }

    string IPlugin.Version
    {
        get { throw new NotImplementedException(); }
    }

    string IPlugin.TabHeader
    {
        get { throw new NotImplementedException(); }
    }
}
}

Реализация плагина "Test" (тот, который загружен GETS):

  namespace HomeSystem
    {
     [Export(typeof(IPlugin))]
    [ModuleExport(typeof(IModule), InitializationMode =   InitializationMode.WhenAvailable)]
    public class Test : IModule, IPlugin
    {
    public void Initialize()
    {

    }

    public string Name
    {
        get { return "Test"; }
    }

    public string Version
    {
        get { return "Tis"; }
    }

    public string TabHeader
    {
        get { return "Tabt"; }
    }
}

}

Надеюсь, вы, ребята, можете помочь

Ура!:)

Ответы [ 2 ]

0 голосов
/ 01 марта 2012

Если честно, я не знаю, чего ты хочешь достичь :) но если вы хотите увидеть свой RejseplanModule в своем звонке:

__container.GetExports<IModule>(); 

Вы должны добавить правильный атрибут экспорта.

RejseplanModule не MEF помечен как экспорт типа IModule. Вы можете проверить свой код, если это опечатка или нет? по крайней мере, должно быть следующее (см. typeof ( IModule ))

EDIT:

внешний dll

[Export(typeof(IModule))]//<-- remove this if its handled by your custom ModulExport Attribute
[ModuleExport(typeof(IModule), InitializationMode = InitializationMode.WhenAvailable)]
class RejseplanModule : IModule, IPlugin
{...}

ваше основное приложение (код из fhnaseer выше)

var directoryPath = "path to dll folder";
var asmCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var directoryCatalog = new DirectoryCatalog(directoryPath, "*.dll");

var aggregateCatalog = new AggregateCatalog();
aggregateCatalog.Catalogs.Add(asmCatalog);
aggregateCatalog.Catalogs.Add(directoryCatalog);

var container = new CompositionContainer(aggregateCatalog);

var allIModulPlugins = container.GetExports<IModule>();
0 голосов
/ 29 февраля 2012

попробуй сделать это.

var directoryPath = "path to dll folder";
var asmCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var directoryCatalog = new DirectoryCatalog(directoryPath, "*.dll");

var aggregateCatalog = new AggregateCatalog();
aggregateCatalog.Catalogs.Add(asmCatalog);
aggregateCatalog.Catalogs.Add(directoryCatalog);

var container = new CompositionContainer(aggregateCatalog);

container.ComposeParts(this);
...