ASP.net UserControl和AppDomain TypeResolve

4
我正在使用VirtualPathProvider来包含在编译时不可用的用户控件。除了实际包含控件的dll之外,一切都正常工作。
当调用包含控件的页面时,如果我不将dll放在bin文件夹中,则无法找到控件类型。
错误: 解析器错误 描述:在服务此请求所需的资源解析期间发生错误。请查看以下特定的解析错误详细信息,并适当修改您的源文件。
解析器错误消息:无法加载类型 'App.Modules.ModuleA.Controls.Entity1Item'。 源错误: Line 1: <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Entity1Item.ascx.cs" Inherits="App.Modules.ModuleA.Controls.Entity1Item" %> 我尝试处理所有重要的AppDomain事件(AssemblyResolve、TypeResolve和ReflectionOnlyAssemblyResolve),但没有一个针对我的类型被调用。
我在TypeResolve文档中看到,每当执行Type.GetType并且未找到类型时就会调用此方法。似乎ASCX在需要其类型时没有触发该事件...为什么呢?
谢谢! Alex

我遇到了同样的问题 - 当我跟踪AppDomain.GetAssemblies()时,它列出了包含该类型的程序集,因此我不确定它是否实际上需要触发TypeResolve事件,但是当加载UserControl时,它会抛出“无法加载类型...”的异常。 - lukiffer
你写道:“我正在使用VirtualPathProvider来包含在编译时不可用的用户控件”。请注意,用户控件(ascx文件)从不需要在编译时,而是始终在运行时处理。因此,你不应该需要VPP。你可能需要澄清你想要做什么。 - David Ebbo
我不确定原问题提出者的项目,但我正在从程序集(预编译站点)检索ascx文件(嵌入式资源),因此使用了VPP。 - lukiffer
另外,您能澄清一下Entity1Item类型是在哪里定义的吗?它在哪个程序集中,该程序集在哪里? - David Ebbo
Lukiffer:如果您的ascx不在文件系统上,那么VPP是有意义的。但是这里的问题似乎更与包含基类的程序集相关,而不是与ascx本身相关。 - David Ebbo
David Ebbo:同意,看起来区别在于包含基类的程序集是否为动态程序集。如果我将包含该 DLL 的路径添加到 web.config 运行时部分的探测路径中,而不是依赖于 AssemblyResolve 事件,那么它就可以正常工作。 - lukiffer
2个回答

3
一个AssemblyResolve事件应该可以解决这个问题,但是你需要在类型名称中指定程序集的名称,例如:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Entity1Item.ascx.cs"
    Inherits="App.Modules.ModuleA.Controls.Entity1Item, YourDynamicAssemblyName" %>

装配体解析事件随后会触发并要求您加载“YourDynamicAssemblyName”。

0

哪些内容可以虚拟化? 可浏览类型,如 ASPX、主页面、ASCX 和主题,是唯一可以虚拟化的项目... 要虚拟非默认可浏览内容,您需要映射一个 BuildProvider 类。

“当 BuildProvider 构建时,它会在临时 ASP.NET 文件夹中构建一个新类。添加到文件夹中的任何类都会自动对您的应用程序可用。” 所以对我来说,看起来您需要映射 System.Web.Compilation.UserControlBuildProvider,以在运行时构建您的用户控件,而不是解析类型,但现在我不知道如何做。希望这仍然有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接