2013-10-09 3 views
4

MEF를 사용하여 asp.net 웹 폼용 일종의 플러그인 시스템을 만들려고합니다.asp.net dynamicaly 로딩 어셈블리

지금까지 호스트 웹 사이트가 플러그인 폴더에서 검색하여 모듈이라는 다른 웹 사이트를로드하는 솔루션을 보았습니다. 모듈 (플러그인)은 또 다른 웹 사이트 프로젝트이기 때문에 bin 하위 폴더에 자체 어셈블리가 있습니다.

이미 알고 계시 겠지만 ASP.NET 응용 프로그램은 폴더 외부에서 DLL을로드하지 않습니다. 따라서 모듈 페이지 (예 : 플러그인/MyModule/Page.aspx)에 액세스하려고 시도하면됩니다. 서버가 어셈블리를로드 할 수 없다는 오류 메시지가 나타납니다. MyModule. 모듈 폴더에 어셈블리를 던질 수 있고 모든 것이 작동하지만 모든 모듈 파일을 같은 폴더에 보관하고 싶습니다.

그래서 폴더 외부에 어셈블리를로드하는 방법을 찾고 있습니다. 나는 web.config 파일을 망쳐 놓으려고했으나 제대로 작동하지 못했습니다.

는 다음 나는 BuildManager 클래스 건너 와서이 코드를 썼다 :

string pluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins"); 
foreach (string f in Directory.GetDirectories(pluginPath)) 
{ 
    string binPath = Path.Combine(f, "bin"); 
    if (Directory.Exists(binPath)) 
    { 
     foreach (String file in Directory.GetFiles(binPath, "*.dll")) 
     { 
      Assembly a = Assembly.LoadFrom(file); 
      BuildManager.AddReferencedAssembly(a); 
     } 
    } 
} 

는 그것은 폴더를 포함하는 다른 하위 폴더에 대한 플러그인 폴더를 검색하고 를 사용하여 해당 어셈블리를로드를 BuildManager. 이 코드가 작동하도록하려면 global.aspx 어셈블리로 호출해야합니다.

이제 플러그인 페이지 (플러그인/MyModule/Page.aspx)로 이동하면 이전 오류는 표시되지 않지만 페이지는 비어 있습니다. 원본을 확인했는데 html이 없습니다. 페이지 디버깅을 시도했지만 Page_Load 메서드는 호출되지 않습니다. 그래서 나는 어떻게 든 뒤에있는 코드는 Page.aspx이 호출되지 않는다고 생각합니다.

아이디어가 있으십니까?

감사합니다.

편집 :

그래서 조금 검색 한 후 더 내가 거기에 해결책을 발견 : 나는 모듈 어셈블리를로드 할 때

BuildManager Resolving Page Inheritance

, 나는 dictionnay에서의 참조를 저장합니다. 그런 다음 이벤트 처리기에서 AppDomain.CurrentDomain.AssemblyResolve으로 대응하는 모듈 어셈블리를 반환합니다.

답변

7

같은 문제가 있습니다. 다음과 같이 어셈블리를 해결하여 수정했습니다.

protected virtual void Application_Start(object sender, EventArgs e) 
    { 

     //... 

     AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 
    } 

    System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     var currentAssemblies = AppDomain.CurrentDomain.GetAssemblies(); 

     foreach (var assembly in currentAssemblies) 
     { 
      if (assembly.FullName == args.Name || assembly.GetName().Name == args.Name) 
      { 
       return assembly; 
      } 
     } 

     return null; 
    } 
+0

감사합니다. 동일한 해결책을 찾았습니다. – cpaulus