tags:

views:

88

answers:

1

Hi guys, I have dicided to play a little bit with MEF2 and net3.5 and I have thougth it would be easy but I am stuck now. Generaly the idia of my toy is I want to have form containet where I am going to load form extantions and show them. I did this code

My extantion :


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();
        }

    }
}

and form container


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);
                }
        }

    }
}

The problem is I can not load my extantion and I have this error

{"The composition remains unchanged. The changes were rejected because of the following error(s): The composition produced a single composition error. The root cause is provided below. Review the CompositionException.Errors property for more detailed information.\r\n\r\n1) No exports were found that match the constraint '((exportDefinition.ContractName = \"FormsContainer.FormContainer+IForm\") && (exportDefinition.Metadata.ContainsKey(\"ExportTypeIdentity\") && \"FormsContainer.FormContainer+IForm\".Equals(exportDefinition.Metadata.get_Item(\"ExportTypeIdentity\"))))'.\r\n\r\nResulting in: Cannot set import 'FormsContainer.FormContainer.Forms (ContractName=\"FormsContainer.FormContainer+IForm\")' on part 'FormsContainer.FormContainer'.\r\nElement: FormsContainer.FormContainer.Forms (ContractName=\"FormsContainer.FormContainer+IForm\") --> FormsContainer.FormContainer\r\n"}

I would be so glad if anybode enlighten me How I can achive it with MEF ? and What I do wrong ?.

+2  A: 

You are declaring the IForm interface in two different places. If you only reference one interface that both are using this code works properly.

JoshVarga
Yep, I just came across on it 2 days ago. There was very obvious issue with contract between Exporter and Importer. My solution is I create the assembly only with IForm interface after that I use it in other my assemblies it solves contract issue.
Galkin
I guess if it helped mark as answer
JoshVarga