【问题标题】:Cannot Load implementations of interfaces from EXTERNAL DLL无法从外部 DLL 加载接口的实现
【发布时间】:2011-09-06 14:57:06
【问题描述】:

这是我的 Compose 部分,我在 dir Catalog THE RIGHT NUMBER that should be loaded 以及 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的接口和属性定义

【问题讨论】:

    标签: .net .net-4.0 mef


    【解决方案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; }
    

    值得一看 Daniel Plaisted 的博客文章 How to Debug and Diagnose MEF Failures 以了解您可能遇到问题的地方。

    【讨论】:

    • 非常感谢这是解决问题的方法。仅供参考,我原来的导入语句是 //public Lazy[] Q95EventHandlers { get;放; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2014-06-19
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多