2010-06-16 3 views
0

shown here과 비슷한 방식으로 플러그인을로드하려고하지만로드 된 어셈블리가 동일한 컨텍스트를 공유하지 않는 것처럼 보입니다.Structuremap을 통해 어셈블리를로드하는 중 컨텍스트

문제를 해결하기 위해 나는 두 개의 어셈블리가 포함 된 작은 스파이크를 만들었습니다. 하나의 콘솔 앱과 하나의 라이브러리. 콘솔 앱에는 IPlugin 인터페이스가 포함되어 있으며 플러그인 DLL에 대한 참조가 없습니다.

나는 사용자 정의 등록 규칙을 사용하여 플러그인 디렉토리를 스캔하고 있습니다 :

"IPlugin에 플러그인 형식을 변환 할 수 없습니다"라는 잘못된 캐스트 예외를 슬로우하는
ObjectFactory.Initialize(x => x.Scan(s => 
    { 
     s.AssembliesFromPath(@"..\Plugin"); 
     s.With(new PluginScanner()); 
    })); 

public void Process(Type type, Registry registry) 
{ 
    if (!type.Name.StartsWith("P")) return; 

    var instance = ObjectFactory.GetInstance(type); 
    registry.For<IPlugin>().Add((IPlugin)instance); 
} 

. 난 그냥 (그런데 잘 작동) 인스턴스를 구성하고 플러그인 ObjectFactory.WhatDoIHave()에서 ObjectFactory를 액세스하려고하면 또한

는 인스턴스를 플러그인과 인스턴스를 호스트하는 경우에도 동일한 컨테이너를 공유하지 않는 것을 보여줍니다 예.

MEF, Structuremap을 사용하여 실험하고 Assembly.Load ("플러그인")가 수동으로로드되어 어셈블리를로드하면 Assembly.Load가로드되어 있으면 제대로 작동합니다. 어떤 아이디어를 어떻게 구조체 맵 스캐닝과 함께 작동하도록 고칠 수 있습니까?

답변

0

해결책을 찾았습니다.

\Plugins 
     \Plugin.dll 
     \core.dll 
\app.exe 
\core.dll 

이 그래서 IPlugin이 core.dll에 정의되어

는이 구조를 가져 가라. 내 플러그인은 핵심뿐만 아니라 내 애플 리케이션에 의존하고있다. 내 응용 프로그램은 core.dll을로드하고 plugin.dll을로드합니다. 그러면 해당 플러그인 폴더의 종속성을 검색합니다. core.dll을 두 번로드 중입니다.

Plugin.dll에서 유형을 가져 와서 코어에서 IPlugin으로 캐스팅하려고하면 {PluginDir} Core.IPlugin의 하위 클래스 인 객체를 {AppDir} Core.IPlugin으로 캐스팅하려고 시도합니다. 인터페이스가 다른 인터페이스이기 때문에 실패합니다.

\Plugin.dll 
\app.exe 
\core.dll  

이 시나리오는 app.exe와 plugin.dll이 모두 동일한 core.dll을 사용하기 때문에 정상적으로 작동합니다.

관련 문제