繁体   English   中英

MEF。 如何将Winform加载到Winform容器中?

[英]MEF. How to load a winform into winform container?

我决定对MEF2和net3.5进行一些测试,我认为这很容易,但是现在我被困住了。 通常,我的玩具的想法是我想要在要加载表单扩展并显示它们的地方具有表单容器。 我做了这段代码

我的扩展名:


using System.ComponentModel.Composition;
using System.Windows.Forms;

namespace MyExtantion
{
    public interface IForm
    {
        void LoadForm(Form form);
    }

    [Export(typeof(IForm))]
    public partial class MyExtantion : Form, IForm
    {
        public MyExtantion()
        {
            InitializeComponent();
        }

        public void LoadForm(Form form)
        {
            MdiParent = form;
            Show();
        }

    }
}

并形成容器


using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
using System.Windows.Forms;

namespace FormsContainer
{
    public partial class FormContainer : Form
    {
        public FormContainer()
        {
            InitializeComponent();
        }

        private CompositionContainer _container;

        public interface IForm
        {
            void LoadForm(Form form);
        }

        [Import(typeof(IForm))]
        public IEnumerable Forms { get; set; }

        private bool Compose()
        {
            var catalog = new AggregateCatalog(
                new AssemblyCatalog(Assembly.GetExecutingAssembly()),
                new DirectoryCatalog("Extantions"));
            var batch = new CompositionBatch();
            batch.AddPart(this);

            _container = new CompositionContainer(catalog);

            try
            {
                _container.Compose(batch);
            }
            catch (CompositionException compositionException)
            {
                MessageBox.Show(compositionException.ToString());
                return false;
            }

            return true;
        }

        private void FormContainer_Load(object sender, EventArgs e)
        {
            if (Compose())
                foreach (IForm form in Forms)
                {
                    form.LoadForm(this);
                }
        }

    }
}

问题是我无法加载引爆,并且出现此错误

{“组成保持不变。由于以下错误,更改被拒绝:组成产生了一个组成错误。下面提供了根本原因。请查看CompositionException.Errors属性以获取更多详细信息。\\ r \\ n \\ r \\ n1)找不到与约束'(((exportDefinition.ContractName = \\“ FormsContainer.FormContainer + IForm \\”)&&(exportDefinition.Metadata.ContainsKey(\\“ ExportTypeIdentity \\”)&& \\“ FormsContainer.FormContainer + IForm \\“。Equals(exportDefinition.Metadata.get_Item(\\” ExportTypeIdentity \\“)))))'。\\ r \\ n \\ r \\ n结果:无法设置导入'FormsContainer.FormContainer.Forms(ContractName = \\” FormsContainer。 'FormsContainer.FormContainer'上的FormContainer + IForm \\“)'。\\ r \\ n元素:FormsContainer.FormContainer.Forms(ContractName = \\” FormsContainer.FormContainer + IForm \\“)-> FormsContainer.FormContainer \\ r \\ n”}

我如何使用MEF实现它? 和我做错了什么?

您在两个不同的地方声明了IForm接口。 如果仅引用一个接口,则两个接口都可以正常使用此代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM