MEF 2 состав с .NET 4.5, магазин Windows PCL
-
21-12-2019 - |
Вопрос
У меня проблемы с тем, чтобы получить MEF, чтобы удовлетворить импорт и может использовать некоторую помощь.
К сожалению, проблема проявляется только в базе продукции кода. Я пытался упростить проблему, чтобы я мог бы опубликовать пример и увидеть, где мое отсутствие понимания, но упрощенная версия работала. Так что это либо я упускаю разницу (и я сделал все возможное, чтобы тщательно выглядеть на двух), или сложность необходима для воспроизведения.
У меня есть приложение WPF, потребляющее библиотеки классов .NET 4.5 и библиотеки портативных классов (нацеливание .NET 4.5 и приложения для хранения Windows 8). У меня еще нет приложения для хранения 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;
}
}
}
.
ImportedName делает значение «экспортировано». В моем производственном коде я получаю компаниюFailedException с деталями:
Дополнительная информация: отсутствующая зависимость «UserInformation» на «MainWindowViewModel».
Решение
Я нашел свою корневую причину.
Мои .NET 4.5 Сборы получали в MEF, используя:
using System.ComponentModel.Composition;
.
Пока мою сборку PCL используют:
using System.Composition;
.
Обновление всего до System.Composition Решина проблема.