2014-10-09 6 views
1

ExportProvider.GetExportedValues ​​메서드를 작성하거나 사용할 때. 예외 CompositionContractMismatchException이 Throw됩니다. 정적 팩터로 뿌려진 레거시 코드를 변환 중이므로 예를 들어 MEF 컨테이너에 반환 값을 표시하기 만하면됩니다.MEF 예외 : CompositionContractMismatchException

namespace fooProject 
{ 
    static class SomeExportFactory 
    { 
     [Export(typeof(IFoo))] 
     public static FooImp Generate() 
     { 
      return new FooImp(); 
     } 
    } 
} 

그래서,이 간단한 그림이 메시지와 함께 예외를 던질 것 ' "'IFoo '을 입력합니다."유형의 기본 내보내기 값 (IFoo fooProject.SomeExportFactory.Generate ContractName =) "를 캐스팅 할 수 없습니다"' "IFoo"를 입력하십시오.].

이 문제의 원인은 무엇입니까? 나는 이미 인터넷을 샅샅이 뒤졌고 CompositionContractMismatchException when trying to use MEF with MVC controller은 내가 찾을 수있는 닫는 물건이지만,이 경우에는 중복 어셈블리가 없다.

답변

2

좋아, 대답을 찾았습니다. 정적 함수에서 내보내기하지 마십시오 !!!. 희망 이이 상황에서 다른 사람을 도와줍니다.

정적 함수에서 내보내려고하는 경우 MEF에서 암호 예외가 발생합니다. 잠재적으로 중복 된 어셈블리가로드 된 것처럼 보이는 예외가 발생합니다. 마찬가지로 일부 답변, 제안하지만.

더 자세한 정보가 필요한 사용자에게 제공됩니다 (현재 MEF 구현에 대한 링크가 제공됨). 코드가 ContractServices.cs에 있습니다. 공용 정적 함수 "TryCast"가 있습니다. MEF가 지정된 유형에 박스형 객체의 인스턴스를 제공하는 메커니즘을 제공합니다. 하지만 2 가지 조건 만 검사합니다. 첫째, 전달 된 객체는 이미 원하는 유형입니다. 둘째, 객체는 ExportedDelegate를 통해 제공됩니다 (아마도 멤버 함수 내보내기가 어떻게 작동하는지). 내보내기가 이들 중 어느 것과도 맞지 않으면 false가 반환되고 즉시 CompositionContractMismatchException이 throw됩니다 (ExportServices.cs T CastExportedValue (ICompositionElement 요소, 개체 exportedValue) 함수 참조).

나는이 상황에서 DummyDontUseStaticException을 던지기를 바랐다 : p