2009-07-30 9 views
1

"콘텐츠"(ASPX/ASCX 및 어셈블리) 파일을 다른 위치에 저장하는 ASP.Net 웹 응용 프로그램을 만들려고합니다. 시스템 (예 : 서비스 내부)에 저장하고 필요에 따라 동적으로로드합니다.동적으로로드하는 페이지 클래스/어셈블리 : 형식 또는 이름을 전역 네임 스페이스에서 찾을 수 없습니다.

대체 위치에서 ASPX/Master/ASCX 파일을 읽는 VirtualPathProvider를 성공적으로 만들었지 만 ASPX 페이지가 클래스를 상속 할 때 문제가 발생합니다. 즉, 코드가 뒤에있는 경우입니다.

답변 덕분에 another question 이제 런타임에 어셈블리를 응용 프로그램에로드 할 수있게되었습니다. 나는 당신이보고 쉽게되도록 잘못 무슨 일이 일어나고 있는지의 간단한 예제에 내 코드를 삶은 한

"Compiler Error Message: CS0400: The type or namespace name 'Web' could not be found in the global namespace (are you missing an assembly reference?)"

[System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()] public class default_aspx : global::Web.Code.CodeBehind, System.Web.SessionState.IRequiresSessionState, System.Web.IHttpHandler

: 내 런타임 내 페이지를 컴파일하려고 할 때 나는 다음과 같은 오류가 발생합니다. You can download this code here.

어셈블리는 런타임에 AppDomain.AssemblyResolve 이벤트를 사용하여 동적으로로드됩니다. 이것은 global.asax에 있으며 다음과 같이 보입니다 :

protected void Application_Start(object sender, EventArgs e) 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Assembly_Resolve); 
} 

Assembly Assembly_Resolve(object sender, ResolveEventArgs args) 
{ 
    Assembly assembly = AppDomain.CurrentDomain.Load(Resources.Web_Code); 
    if (args.Name == assembly.FullName) 
    { 
     return assembly; 
    } 
    return null; 
} 

아이디어가 있으십니까?

편집 어떤 이유로 당신이 Web.Code 어셈블리를 업데이트해야하는 경우 - 당신이 그 변경 사항을 적용하기 위해 웹 프로젝트의 "ReferencedAssemblies"폴더에 복사해야합니다.

답변

0

확인. 다음을 시도해 볼 수 있습니까? AssemblyResolve 이벤트를 제거하십시오. 이제 web.config 런타임 구성을 사용하여이 어셈블리를 해결합니다. <runtime> 구성에서 다음과 같은 추가 :

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <probing privatePath="ReferencedAssemblies" /> 
</assemblyBinding> 

내가 나 자신에게 설명 할 수없는 이유를 두 가지 방법 - AppDomain.AssemblyResolvePageBuildProvider를 처리 할 때 다른 결과를 AssemblyBinding이 런타임. PageBuildProvider 클래스를 둘러 보면서 일어난 일에 대한 단서를 찾았지만 여전히 운이 없다. 아마 내 관심을 가지고 여기에 더 볼 것입니다 그리고 만약 내가 어떤 해결책을 찾으면 여기에 게시됩니다.

web.config 파일을 사용하여이 솔루션을 사용할 수 있는지 알려주세요. 유일한주의 사항은 리소스를 사용하여 어셈블리를 저장할 수 없다는 것입니다. ReferencedAssemblies 폴더가있는 프로젝트 시스템 아래에있는 폴더를 파일 시스템에 저장해야합니다.

+0

안녕하세요 이반, 저는 현재이 기술을 사용할 가능성에 대해 조사하고 있습니다. 그러나 파일 시스템에 쓸 필요가 없기를 바라고 있습니다. 이상적으로 이러한 어셈블리는 메모리 상주에만 적합합니다. 좋은 아이디어. –

+0

그게 내가하는 일이다. 어셈블리가 Assembly.LoadFromFile (...) 메서드를 사용하여 파일 시스템에서로드 된 경우에만 모든 것이 작동한다. 다른로드 컨텍스트가 있습니다. http://msdn.microsoft.com/en-us/library/dd153782(v=vs.110).aspx –

1

DB에서 어셈블리를로드하려고 할 때 (그리고 AssemblyResolve 이벤트를 사용하여) 동일한 문제가 발생했습니다. 그러나 디스크에서 어셈블리를로드하거나 디스크의 .dll 파일 복사본을 적어도 어딘가에 저장하면 제대로 작동하는 것 같습니다.

관련 문제