ASP.net UserControl 和 AppDomain TypeResolve
Posted
技术标签:
【中文标题】ASP.net UserControl 和 AppDomain TypeResolve【英文标题】:ASP.net UserControl and AppDomain TypeResolve 【发布时间】:2011-07-27 10:54:07 【问题描述】:我正在使用 VirtualPathProvider 来包含在编译时不可用的用户控件。 除了对实际包含控件的 dll 的引用之外,一切都正常工作。
调用有控件的页面时找不到控件类型,除非我把dll放到bin文件夹中。
错误: 解析器错误 说明:解析服务此请求所需的资源时出错。请查看以下特定的解析错误详细信息并适当修改您的源文件。
解析器错误消息:无法加载类型 'App.Modules.ModuleA.Controls.Entity1Item'。
来源错误:
第 1 行:
我尝试处理所有重要的 AppDomain 事件(AssemblyResolve、TypeResolve 和 ReflectionOnlyAssemblyResolve),但我的类型没有调用。
我在 TypeResolve 文档中看到,只要执行 Type.GetType 并且找不到类型,就会调用它。似乎 ASCX 在需要它的类型时没有触发事件......为什么?
谢谢! 亚历克斯
【问题讨论】:
我遇到了同样的问题 - 当我跟踪 AppDomain.GetAssemblies() 它列出了包含该类型的程序集,因此我不确定它是否真的需要触发 TypeResolve 事件,但是在加载时UserControl 会抛出“无法加载类型...”异常。 您写道“我正在使用 VirtualPathProvider 来包含在编译时不可用的用户控件”。请注意,编译时从不需要用户控件(ascx 文件),并且始终在运行时处理。因此,您不需要 VPP。您可能需要澄清您要做什么。 我不确定原始提问者的项目,但我正在从程序集(预编译站点)中检索 ascx 文件(嵌入资源),因此使用了 VPP。 另外,你能澄清一下 Entity1Item 类型是在哪里定义的吗?它在哪个程序集中,该程序集在哪里? Lukiffer:是的,如果您的 ascx 不在文件系统上,VPP 就有意义。但是这里的问题似乎更多地与包含基类的程序集有关,而不是与 ascx 本身有关。 【参考方案1】:AssemblyResolve 事件应该可以解决这个问题,但您需要在类型名称中指定程序集名称,例如
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Entity1Item.ascx.cs"
Inherits="App.Modules.ModuleA.Controls.Entity1Item, YourDynamicAssemblyName" %>
随后将触发 AssemblyResolve 事件,要求您加载“YourDynamicAssemblyName”。
【讨论】:
【参考方案2】:Which content can be virtualized? Browseable types, such as ASPX, master pages, ASCX, and themes, are the only items that can be virtualized ... To virtualize non-default browsable content, you need to map a BuildProvider class.
“当 BuildProvider 构建时,它会在 Temporary ASP.NET Files 文件夹中构建一个新类。添加到该文件夹的任何类都会自动对您的应用程序可用。”所以对我来说,看起来你需要映射 System.Web.Compilation.UserControlBuildProvider 来在运行时构建你的用户控件而不是解析类型,但现在我不知道该怎么做。希望还是有用的
【讨论】:
以上是关于ASP.net UserControl 和 AppDomain TypeResolve的主要内容,如果未能解决你的问题,请参考以下文章
在 asp.net 中,如何从 usercontrol 获取自定义 webcontrol 的引用?
如何为 ASP.net UserControl 指定命名空间?
[ASP.NET]UserControl透过属性,动态加入RequiredFieldValidator
将 Asp.Net UserControl 用作 SharePoint WebPart