Невозможно загрузить реализации интерфейсов из ВНЕШНЕЙ DLL - PullRequest
0 голосов
/ 06 сентября 2011

Это моя часть Compose, где я вижу в каталоге dir ПРАВИЛЬНЫЙ НОМЕР, который также должен быть загружен, в asmCatalog.

public void Compose()
{
    var aggrCatalog = new AggregateCatalog();
    //A directory catalog
    var dirCatalog = new DirectoryCatalog(Path.GetDirectoryName(
        Assembly.GetExecutingAssembly().Location) + "\\Extensions", "*.dll");
    //An assembly catalog
    var asmCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());

    aggrCatalog.Catalogs.Add(dirCatalog);
    aggrCatalog.Catalogs.Add(asmCatalog);

    //Create a container THE CONTAINER DOES CONTAIN 5 PARTS AND
    // LOOK PERFECTLY OK. The 5 parts consist of 3 from this assembly 
    // and two from the external assembly
    var container = new CompositionContainer(aggrCatalog);

    // IT DOES NOT COMPOISE THE 2 PARTS THAT WERE LOADED FROM THE EXTERNAM ASSY
    container.ComposeParts(this);
}

Я использую этот интерфейс и атрибуты:

namespace Q95Interface
{
    public interface IQ95_EventHandler
    {
        void HandleQ95Event();
        void HandleQ95Event(string s);
    }

    public interface IUIExtensionDetails
    {
        string Event_Group_Name { get; }
        string Event_Name { get; }
    }

    [MetadataAttribute]
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
    public class Q95_EventHandlerAttribute : ExportAttribute
    {
        public Q95_EventHandlerAttribute() : base(typeof(IQ95_EventHandler)) { }

        public string Event_Group_Name { get; set; }
        public string Event_Name { get; set; }
    }
}

И реализации, которые я хочу импортировать (те, что в локальной сборке выглядят ИДЕНТИЧНО, загружаются и работают отлично)

namespace MefTest
{
    [Export(typeof(IQ95_EventHandler))]
    [ExportMetadata("EventType", "START_ORDER_EXTERNAL")]
    public class Q95_Event_Handler4 : IQ95_EventHandler
    {
        public void HandleQ95Event() 
        { 
            Console.WriteLine("HANDLE EVENT START_ORDER"); 
        }
        public void HandleQ95Event(string s) { Console.WriteLine(s); }
    }

    [Export(typeof(IQ95_EventHandler))]
    [ExportMetadata("EventType", "STOP_ORDER_EXTERNAL")]
    public class Q95_Event_Handler5 : IQ95_EventHandler
    {
        public void HandleQ95Event() 
        { 
            Console.WriteLine("\nHANDLE EVENT STOP_ORDER\n"); 
        }
        public void HandleQ95Event(string s) { Console.WriteLine(s); }
    }
}

Я отдельно скомпилировал в dll интерфейс и определения атрибутов

1 Ответ

1 голос
/ 06 сентября 2011

Как определяется ваш [Import]? Я подозреваю, что это вероятно, потому что ваш экспорт не экспортирует метаданные. Фактически вы создали настраиваемый атрибут экспорта и не используете его.

Попробуйте изменить экспорт:

[Q95_EventHandler(Event_Group_Name = "Something", Event_Name = "Something Else")]
public class Q95_Event_Handler5 : IQ95_EventHandler
{

}

И убедитесь, что вы импортируете соответственно:

[ImportMany]
public IEnumerable<Lazy<IQ95_EventHandler, IUIExtensionDetails>> Handlers { get; set; }

Стоит взглянуть на статью в блоге Дэниела Плейстеда, озаглавленную Как отлаживать и диагностировать сбои MEF , чтобы понять, где вы можете столкнуться с проблемами.

...