2011-03-04 4 views
1

해결하려고하는 문제를 데모하기 위해 작은 테스트 앱을 만들었습니다. 플러그인이 인터페이스에서 파생되는 플러그인 아키텍처가 있습니다.요청한 유형 중 하나 이상을로드 할 수 없습니다. loaderexceptions를 검색하십시오.

namespace Test 
{ 
    public interface ITestBase 
    { 
    int LifeTheUniverseAndEverything(); 
    bool Pessimist(); 
    bool Optimist(); 
    } 
} 

이 주 프로그램 솔루션 및 플러그인 솔루션을 참조하는 .DLL에 빌드 :

여기 인터페이스 코드입니다.

namespace Test 
{ 
    public class TestPlugin : ITestBase 
    { 
    public int LifeTheUniverseAndEverything() { return 41; } 
    public bool Pessimist() { return false; } 
    public bool Optimist() { return true; } 
    } 
} 

이는 "플러그인"주요 작업 디렉토리를 폴더를 삭제하는 .DLL을 생산 : 여기

플러그인 코드입니다.

다음은 주요 프로그램입니다. 요청 된 유형 중 하나 이상을로드 할 수 없습니다 :

namespace Test 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     Console.WriteLine("testing..."); 
     string[] PluginFileLocs; 
     try 
     { 
     string sWorkingDir = Directory.GetCurrentDirectory(); 
     string sPluginDir = sWorkingDir + "\\Plugins"; 
     PluginFileLocs = Directory.GetFiles(sPluginDir, "*.dll"); 
     foreach (string plugin in PluginFileLocs) 
     { 
      Assembly theAssembly = Assembly.ReflectionOnlyLoadFrom(plugin); 
      foreach (Type type in theAssembly.GetTypes()) 
      { 
      string aType = type.FullName; 
      Console.WriteLine(aType); 
      } 
     } 
     } 
     catch (Exception e) 
     { 
     Console.WriteLine("Error: " + e.Message); 
     } 
    } 
    } 
} 

문제는 testplugin 클래스는 ITestBase 인터페이스를 파생 경우 theAssembly.GetTypes에서 예외가 발생한다는 것이다. LoaderExceptions를 검색하십시오. 왜, 어떻게 플러그인에서 인터페이스를 파생시킬 수 있습니까?

+2

그래서'ReflectionTypeLoadException'을 얻게 될 것입니다. 메시지에서 확인하라고하는 로더 예외는 무엇입니까? 예외에는'LoaderExceptions'라는 속성이 있습니다. http://msdn.microsoft.com/en-us/library/system.reflection.reflectiontypeloadexception.loaderexceptions.aspx – vcsjones

답변

3

Assembly.ReflectionOnlyLoadFrom에 대한 문서를 기반으로 자동으로 의존성 http://msdn.microsoft.com/en-us/library/system.reflection.assembly.reflectiononlyloadfrom.aspx

내가 그 여기에서 무슨 일이 일어나고 있는지의 추측하고있어로드되지 않습니다. 인터페이스는 플러그인과 별도의 어셈블리로 정의되므로 GetTypes를 호출하기 전에 먼저 해당 어셈블리를로드해야합니다.

+0

을 참조하십시오. ReflectionOnlyLoadFrom에서 LoadFrom으로 전환하면 문제가 해결되었습니다. –

1

자세한 내용이 없어도 알기가 어렵습니다. 내 추측은 ReflectionOnlyLoadFrom을 사용하여 리플렉션 전용 컨텍스트에로드하기 때문에 종속성을 해결하지 못하고 인터페이스와 플러그 인은 다른 어셈블리에 있으므로 AppDomain에 ReflectionOnlyAssemblyResolve을 처리해야하거나 그렇지 않습니다. 리플렉션 전용 컨텍스트에서로드하십시오.

실제로 플러그인을로드하여 실행하기 때문에 완전히로드하는 것이 더 간단 할 수 있습니다. 플러그 인의 가장 좋은 방법은 플러그 인을 다른 AppDomain에로드하고 잠궈 플러그 인을 샌드 박스에 유지하는 것입니다.

관련 문제