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으로 대응하는 모듈 어셈블리를 반환합니다.
감사합니다. 동일한 해결책을 찾았습니다. – cpaulus