none
关于MEF的问题 RRS feed

  • 问题

  • //接口
    public interface BaseFrm
        {
            string Text { get; set; }
            void Run();
        }


    class Program
        {
            protected CompositionContainer container;
            [Import(typeof(BaseFrm.BaseFrm))]
            public BaseFrm.BaseFrm frms;
    
            [ImportMany] private IEnumerable<BaseFrm.BaseFrm> b;
    
            Program()
            {
                var catalogs = new AggregateCatalog();
                catalogs.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));
                catalogs.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory +"Extents"));
                container = new CompositionContainer(catalogs);
                try
                {
                    container.ComposeParts(this);
                }
                catch (CompositionException cex)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine(cex.Message);
                }
    
            }
    
            static void Main()
            {
                Program p = new Program {frms = {Text = "AFrom"}};
                
                Console.ReadKey();
            }
        }
        
    //导入接口
        [Export(typeof(BaseFrm.BaseFrm))]
        public class FormA : BaseFrm.BaseFrm
        {
            #region Implementation of IFrm
    
            public string Text { get; set; }
    
            public void Run()
            {
                Console.WriteLine(Text);
            }
    
            #endregion
        }

    以上代码可以正常运行(因为只有一个FormA导入了接口),但是在增加一个BFrm类(这个类也导入了接口),就报错了。

    以下是BFrm类

    [Export(typeof(BaseFrm.BaseFrm))]
        public class BFrm:BaseFrm.BaseFrm
        {
            #region Implementation of BaseFrm
    
            public string Text { get; set; }
            public void Run()
            {
                Console.WriteLine(Text);
            }
            #endregion
        }

    在运行的时候就报错了。

    container.ComposeParts(this);  这里出错了。

    2012年11月21日 5:56

答案

全部回复

  • 撰写保持不变。由于以下错误,更改被拒绝: 撰写生成了一个撰写错误,其根本原因有 1 点,如以下所列。 有关详细信息,请查看 CompositionException.Errors 属性。

    1) 找到多个与约束 
    ContractName PLANCK.BaseFrm.BaseFrm
    RequiredTypeIdentity PLANCK.BaseFrm.BaseFrm 匹配的导出

    结果: 无法对部件“PLANCK.MainApp.Program”设置导入“PLANCK.MainApp.Program.frms (ContractName="PLANCK.BaseFrm.BaseFrm")”。
    元素: PLANCK.MainApp.Program.frms (ContractName="PLANCK.BaseFrm.BaseFrm") -->  PLANCK.MainApp.Program
    2012年11月21日 6:02
  • 解决了。自己写错了。谢谢!
    • 已标记为答案 server 126 2012年11月21日 9:34
    2012年11月21日 9:33
  • Hi server 126,

      欢迎来到MSDN论坛支持系统。

      很高兴看到你自己解决了问题,希望你能把解决的步骤和结果在这边贴出来,这样我们其他论坛成员遇到了类似的问题,也能够及时解决,谢谢。


    Jason Wang [MSFT]
    MSDN Community Support | Feedback to us

    2012年11月22日 3:29
    版主
  • 最典型的垃圾。
    2014年11月3日 15:34