2011-02-17 5 views
1

에 나는 System.ComponentModel.Composition.dll 버전을 사용하여 .NET 3.5 프레임 워크에서 잘 작동 인터넷에서 쉽게 샘플을 가지고 V2.0.50727은 MEF - 마이그레이션 .NET 3.5에서 .NET 4.0

프로젝트 정의를 변경하고 대상을 .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 

내가 MEF에 관한 .NET 4.0로 마이그레이션하려면 어떻게해야합니까?

답변

0

확인을 클릭하면 문제가 발견되었습니다. 분명히 이전 버전의 표기법은 내 이전 코멘트에서 언급 한 바와 같이, 그러나 새로운 .NET 4.0 버전에서 수입에 대한 구문은 다음과 같아야합니다

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

공지 사항 대신 목록ImportMany의 사용 IList 및 가져 오기.

+1

'IEnumerable '과'ImportMany'를 사용할 수 없습니까? 나를 위해 최소한 작품, 그리고 강하게 입력되는 장점이 있습니다. – Femaref

1

다른 프로젝트가 .net 3.5 버전을 계속 참조 할 수 있습니까? 오류 메시지에는 두 가지 유형의 수출 인 IPlugin이 있으며, 이는 3.5 버전과 4.0 버전의 dll을 모두 찾습니다.

MefTutorial의 4.0 버전 만 참조 및/또는 존재하는지 확인하십시오.

+0

나는 이것을 두 번째로 할 것이다. Visual Studio의 'Clean'은 쓰레기입니다. 요 전날 비슷한 오류가 발생했습니다. 출력 폴더를 검사했을 때만 오래된 파일들로 가득 차 있다는 것을 깨달았습니다. – Tim

+0

그래, MEF도 그 문제가 있었어. 그것은 여전히 ​​오래된 DLL을 발견하고 불평했다. – Femaref

+0

비슷한 코드를 사용하는 새로운 Simple 프로젝트를 시작하려고했습니다. 동일한 코드가 dll의 새 버전과 호환되지 않는 것으로 보입니다. 오류 메시지는 '둘 이상의 내보내기가 발견되었습니다'라는 오류 메시지를 나타내며 이는 정확하게 달성하려는 것입니다. 하지만 왜 그가 내 표기법이 마치 하나의 인스턴스를 가져 오는 것 같다고 생각합니까? – Ascii