MEF 2 Композиция с.NET 4.5, Windows Store PCL

У меня возникли проблемы с получением MEF для удовлетворения импорта и может помочь.

К сожалению, проблема проявляется только в базе производственного кода. Я попытался упростить проблему, чтобы я мог опубликовать пример и посмотреть, где мое непонимание, но упрощенная версия сработала. Так что это либо я пропускаю разницу (и я приложил все усилия, чтобы тщательно рассмотреть оба), либо сложность необходима для воспроизведения.

У меня есть приложение WPF, использующее библиотеки классов.NET 4.5 и переносимые библиотеки классов (предназначенные для приложений.net 4.5 и windows 8 store). У меня еще нет приложения для магазина Windows 8, но оно запланировано (таким образом, головная боль). Я использую MEF 2, который недавно снял с NuGet:

  <package id="Microsoft.Composition" version="1.0.20" targetFramework="portable-net45+win" />

Я думаю, что я ищу несколько советов о том, как отладить это, так как я не смогу опубликовать реальный код. Большинство онлайн-рекомендаций, которые я могу найти о том, как отлаживать, похоже, не работают с MEF 2, по крайней мере, с этой PCL-совместимой версией. Ниже приведена моя упрощенная версия, но, опять же, эта версия работает.

namespace Portable.Contracts
{
    public interface IExportable
    {
        string Name { get; }
    }
}

namespace Desktop
{
    [Export(typeof(IExportable))]
    public class Exported : IExportable
    {
        public string Name
        {
            get { return "Exported"; }
        }
    }
}

namespace Portable
{
    public class Importer
    {
        [Import]
        public IExportable Exportable { get; set; }

        public Importer()
        {
            MEFLoader.ResolveImports(this);
        }

        public string Name { get { return Exportable.Name; } }
    }
}

namespace Portable
{
    public class MEFLoader
    {
        private static CompositionHost Container { get; set; }
        public static void SetContainer(CompositionHost container)
        {
            Container = container;
        }
        public static void ResolveImports(object target)
        {
            if(Container != null)
            {
                Container.SatisfyImports(target);
            }
        }
    }
}

namespace WPFApp
{
    public partial class App : Application
    {
        public App()
        {
            var container = new ContainerConfiguration()
                .WithAssembly(typeof(Exported).Assembly)
                .CreateContainer();
            MEFLoader.SetContainer(container);

            var importer = new Importer();
            var importedName = importer.Name;
        }
    }
}

importName действительно получает значение "Экспортировано". В моем производственном коде я получаю исключение CompositionFailedException с подробной информацией:

Дополнительная информация: Отсутствует зависимость UserInformation от MainWindowViewModel.

1 ответ

Решение

Я нашел свою основную причину.

Мои сборки.NET 4.5 собирались в MEF, используя:

using System.ComponentModel.Composition;

в то время как мои сборки PCL использовали:

using System.Composition;

Обновление всего до System.Composition решило проблему.

Другие вопросы по тегам