4

我正在使用 VirtualPathProvider 来包含在编译时不可用的用户控件。除了对实际包含控件的 dll 的引用之外,一切都正常工作。

当调用具有控件的页面时,它找不到控件类型,除非我将 dll 放在 bin 文件夹中。

错误:解析器错误描述:解析服务此请求所需的资源期间发生错误。请查看以下特定的解析错误详细信息并适当地修改您的源文件。

解析器错误消息:无法加载类型“App.Modules.ModuleA.Controls.Entity1Item”。

源错误:

第 1 行:<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Entity1Item.ascx.cs" Inherits="App.Modules.ModuleA.Controls.Entity1Item" %>

我尝试处理所有重要的 AppDomain 事件(AssemblyResolve、TypeResolve 和 ReflectionOnlyAssemblyResolve),但我的类型没有调用。

我在 TypeResolve 文档中看到,只要执行 Type.GetType 并且找不到类型,就会调用它。似乎 ASCX 在需要它的类型时没有触发事件......为什么?

谢谢!亚历克斯

4

2 回答 2

3

一个 AssemblyResolve 事件应该可以解决这个问题,但是您需要在类型名称中指定程序集名称,例如

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Entity1Item.ascx.cs"
    Inherits="App.Modules.ModuleA.Controls.Entity1Item, YourDynamicAssemblyName" %>

然后,AssemblyResolve 事件将触发,要求您加载“YourDynamicAssemblyName”。

于 2011-08-03T20:15:41.100 回答
0

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

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

于 2011-08-02T20:50:51.230 回答