MEF 2 .NET 4.5, Windows Store PCL
-
21-12-2019 - |
문제
나는 MEF를 가져 오는 데 어려움을 겪고 있으며 도움을받을 수 있고 도움을받을 수 있습니다.
불행히도 문제는 프로덕션 코드 기반에서만 나타납니다. 나는 문제를 간소화하려고 노력 했으므로 예를 게시하고 나의 이해의 부족이있는 곳을 확인할 수 있지만 단순화 된 버전이 작동했습니다. 그래서 이것은 차이를 놓치고 있습니다 (그리고 나는 2 개에서 철저하게 보이기 위해 최선을 다했거나 복잡성이 필요합니다.
INET 4.5 클래스 라이브러리 및 휴대용 클래스 라이브러리 (.NET 4.5 및 Windows 8 저장소 응용 프로그램)를 사용하는 WPF 응용 프로그램이 있습니다. 나는 아직 Windows 8 저장소 응용 프로그램을 가지고 있지 않지만 계획 (따라서 두통)을 계획합니다. 나는 최근에 Nuget에서 벗어난 Mef 2를 사용하고 있습니다.
<package id="Microsoft.Composition" version="1.0.20" targetFramework="portable-net45+win" />
.
나는 실제 코드를 게시 할 수 없기 때문에 이것을 디버그하는 방법에 대한 조언은 내가 찾고있는 것을 추측한다. 대부분의 온라인 조언은 내가 디버그하는 방법을 찾을 수 있으며, 적어도이 PCL 호환 버전이 아닌 MEF 2에서 작동하지 않는 것 같습니다. 다음은 단순화 된 버전이지만 다시이 버전이 작동합니다.
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은 "내 보낸 값"값을 가져옵니다. 생산 코드에서는 Details로 CompositionFaileDexception을 얻습니다.
추가 정보 : 누락 된 종속성 'userInformation' 'mainwindowviewmodel'.
해결책
내 근본 원인을 찾았습니다.
내 .NET 4.5 어셈블리가 MEF에서 사용 중이
using System.ComponentModel.Composition;
.
내 PCL 조립이 사용되었지만 다음을 사용하고있었습니다.
using System.Composition;
.
SystemCompositition으로 모든 것을 업데이트합니다.