MEF - Миграция с .NET 3.5 на .NET 4.0 - PullRequest
1 голос
/ 17 февраля 2011

У меня есть простой пример из Интернета, который отлично работает в среде .NET 3.5 с использованием System.ComponentModel.Composition.dll версии v2.0.50727

Я изменил определение проекта и изменил цель на .NET 4.0, и она отлично работает.

Когда я заменяю вышеприведенную DLL-версию v2.0.50727 на последнюю версию, v4.0.30319 , я получаю сообщение об ошибке при компоновке контейнера. Код, где он ломается, выглядит следующим образом:


        private void LoadPlugins() {
            var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());

            var container = new CompositionContainer(catalog);
                        container.ExportsChanging += new EventHandler(container_ExportsChanging);

            var batch = new CompositionBatch();
            batch.AddPart(this);
            container.Compose(batch); // throws Exception
        }

И исключением является следующее:


System.ComponentModel.Composition.ChangeRejectedException was unhandled
Message=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.

1) More than one export was found that matches the constraint '((exportDefinition.ContractName == "MefTutorial.IPlugin") AndAlso (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") AndAlso "MefTutorial.IPlugin".Equals(exportDefinition.Metadata.get_Item("ExportTypeIdentity"))))'.

Resulting in: Cannot set import 'MefTutorial.PluginConsumer._myPlugins (ContractName="MefTutorial.IPlugin")' on part 'MefTutorial.PluginConsumer'.
Element: MefTutorial.PluginConsumer._myPlugins (ContractName="MefTutorial.IPlugin") --> MefTutorial.PluginConsumer

Что мне нужно сделать, чтобы перейти на .NET 4.0 в отношении MEF ?

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Может ли быть, что другой проект все еще ссылается на версию .net 3.5?Сообщение об ошибке говорит, что есть два экспорта типа IPlugin, что, я вполне уверен, означает, что находит и dll версии 3.5 и 4.0.

Проверьте, что только версия 4.0 * 1004 4.0* есть ссылка и / или присутствует.

0 голосов
/ 20 февраля 2011

ОК, я нашел проблему. Видимо, в предыдущей версии нотация была такой же, как упомянуто в моем предыдущем комментарии, но в новой версии .NET 4.0 синтаксис для импорта должен быть:

code>
[ImportMany(typeof(IPlugin))] 
internal List _myPlugins { get; set; } 

Обратите внимание на использование List и ImportMany вместо IList и Import.

...