2011-09-06 19 views
0

這是我編寫的部分,我在asmCatalog中看到應加載的目錄編號RIGHT NUMBER。無法加載來自EXTERNAL DLL的接口實現

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

你的[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; } 

這是值得看的丹尼爾·普萊斯特德的題爲How to Debug and Diagnose MEF Failures博客文章中得到的,你可能會運行到理解問題。

+0

非常感謝您這是問題的解決方案。僅供參考我的原始進口聲明是// public Lazy [] Q95EventHandlers {get;組; } – john