2012-01-06 6 views
0

MEF를 사용하여 확장 어셈블리를 동적으로로드하는 응용 프로그램이 있습니다. 하나의 어셈블리는 도메인 계층이고 두 번째 어셈블리는보기입니다. 도메인 어셈블리가로드되어 예상대로 작동합니다. MEF 환경에서 모임 어셈블리 종속성

  • 도메인 프로젝트는
  • 보기 프로젝트

뷰 어셈블리 1..N을 포함 오전 데 문제가 있는지

  • 해결 방법 : 의사의 구조는 다음과 같습니다 첫 번째 어셈블리의 도메인 개체에 대한 시각적 프록시 인 사용자 컨트롤 그러면 뷰가 도메인 계층 어셈블리에 종속되므로보기 어셈블리에 제약 조건이 적용됩니다. 예 : 위에서보기 프로젝트 어셈블리는 도메인 프로젝트 어셈블리에 의존합니다. 뷰 프로젝트의 시각적 프록시를 도메인 프로젝트로 옮기면 문제가 해결 될 수 있다고 생각하지만, 우려의 분리에 맞설 것입니다.

    뷰 어셈블리에서 Assembly.LoadFile() 메서드를 호출하면 일반적인 FileNotFoundException이 발생합니다. 도메인 계층 어셈블리가 처음 실행될 때 응용 프로그램이 실행되는 루트 외부에서로드되고 프로브 경로 내에 있지 않기 때문에 이것이라고 생각합니다. 이 과정에서 내가 바라는 것은 코어 어셈블리가 이미로드되어 뷰 어셈블리에있는 종속성이 만족되었을 것이기 때문입니다. 불행히도 이것은 그렇지 않았습니다.

    AppDomainSetup.PrivateBinPath는 나를위한 옵션이 아닙니다. 이것은 응용 프로그램이 설치된 파일 구조 내에 설치하도록 확장 개발자에게 제한을 가할 것이며 이는 오염을 유발할 것이며 이는 우리가 필요로하거나 원하는 것이 아닙니다. 나는이 작업이 설치된 응용 프로그램 루트 아래에 단일 Extensions 디렉토리를 갖는 것이 훨씬 더 간단하다는 것을 알고 있습니다.

    내가하고 싶은 것은 어셈블리를로드 할 수 있고 이미로드 된 AggregateCatalog에 추가 된 다른 어셈블리가 종속성을 충족시킬 수 있도록하는 것입니다.

    누구나 내 목표를 달성하는 데 도움이되는 의견, 제안 또는 조언이 있습니까?

+0

어디에서 왜 어셈블리 어셈블리에서 Assembly.LoadFile()을 호출합니까? –

+0

기계 전용 확장을 빌드하면 각 어셈블리 파일 참조가 AssemblyCatalog에 추가되고 AssemblyCatalog가 AggregateCatalog에 추가됩니다. 관련 인스턴스로 작업 할 때 시각적 프록시 종속성을 충족시키기 위해 뷰 어셈블리를로드 중입니다. –

답변

1

좋아, 나를위한 해결책은 module initialization through assembly injection을 사용하지 않아야했다. 아주 독창적 인 반면 C#에서 어셈블리를로드 할 때 프레임 워크 4에서는 전혀 호출되지 않는 것으로 보입니다. 다른 상황에서는 작동 할 수 있습니다.

나를위한 해결책은 기본으로 돌아가서 현재 AppDomain의 AssemblyResolve 이벤트에 의존하는 것입니다. 첫째, 내 확장 기능의 ComposablePartCatalog를 작성하는 동안 확장 경로를 컬렉션에 저장했습니다. 어셈블리로드가 실패하면 AssemblyResolve 이벤트가 발생하고 확장 프로그램의 종속성을 찾는 내 확장 경로 컬렉션을 반복합니다.

이것은 설치된 응용 프로그램과 설치된 모든 확장 사이의 분리를 유지하려는 내 목표에 매우 적합합니다.