【发布时间】:2010-05-16 00:33:56
【问题描述】:
这个真的让我很生气。如下:
我的目标是在运行时加载包含嵌入式 aspx、ascx 等的程序集。我还希望不要将程序集文件锁定在磁盘上,这样我就可以在运行时更新它而无需重新启动应用程序(我知道这将保留以前的版本)。
为此,我编写了一个虚拟路径提供程序来解决问题。我已订阅 CurrentDomain.AssemblyResolve 事件,以便将框架重定向到我的程序集。
问题在于,当框架尝试为 aspx 页面编译动态程序集时,我得到以下信息:
编译器错误消息:CS0400:在全局命名空间中找不到类型或命名空间名称“Pages”(您是否缺少程序集引用?)
来源错误: 公共类 app_resource_pages__version_1_0_0_0__culture_neutral__publickeytoken_null_default_aspx : global::Pages._Default, System.Web.SessionState.IRequiresSessionState, System.Web.IHttpHandle
我注意到,如果我使用 Assembly.Load(AssemblyName) 或 Assembly.LoadFrom(filename) 加载程序集,我不会收到上述错误。如果我用 Assembly.Load(byte[]) 加载它(以免锁定它),则会引发异常,但我的 AssemblyResolve 处理程序在调用时会正确返回程序集(它被调用一次)。
所以我猜测它在框架解析 asp 标记时被调用一次,但在它尝试为 aspx 页面创建动态程序集时不会被调用。
【问题讨论】:
-
这里的实际问题是什么?如何以非锁定、非阻塞方式加载新的 .aspx 页面? lede 似乎被埋葬了。
-
问题是为什么在 aspx 页面的编译期间没有触发 AssemblyResolve 事件。有解决办法吗?
标签: c# reflection assemblies loading