C# ASP.net用户控件和AppDomain类型解析

C# ASP.net用户控件和AppDomain类型解析,c#,asp.net,reflection,appdomain,virtualpathprovider,C#,Asp.net,Reflection,Appdomain,Virtualpathprovider,我使用VirtualPathProvider来包含编译时不可用的用户控件。 除了对实际包含控件的dll的引用外,其他所有操作都正常工作 调用包含控件的页面时,除非我将dll放在bin文件夹中,否则无法找到控件类型 错误: 分析器错误 描述:解析服务此请求所需的资源时出错。请查看以下特定的解析错误详细信息,并适当修改源文件 分析器错误消息:无法加载类型 “App.Modules.ModuleA.Controls.Entity1Item” 源错误: 第1行: 我试图处理所有重要的AppDomain事

我使用VirtualPathProvider来包含编译时不可用的用户控件。 除了对实际包含控件的dll的引用外,其他所有操作都正常工作

调用包含控件的页面时,除非我将dll放在bin文件夹中,否则无法找到控件类型

错误: 分析器错误 描述:解析服务此请求所需的资源时出错。请查看以下特定的解析错误详细信息,并适当修改源文件

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

源错误:

第1行:

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

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

谢谢! 亚历克斯


“当BuildProvider生成时,它会在临时ASP.NET文件文件夹中生成一个新类。添加到该文件夹中的任何类都会自动对您的应用程序可用。”因此,对我来说,您似乎需要映射System.Web.Compilation.UserControlBuildProvider,以便在运行时生成您的usercontrols,而不是解析类型,但现在我不知道怎么做。希望它仍然有用

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

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


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

我也遇到了同样的问题-当我跟踪AppDomain.GetAssemblys()时,它列出了包含类型的程序集,因此我不确定它是否真的需要触发TypeResolve事件,但是在加载UserControl时,它抛出了“无法加载类型…”异常。您写道“我正在使用VirtualPathProvider来包含编译时不可用的用户控件”。请注意,在编译时不需要用户控件(ascx文件),并且总是在运行时进行处理。因此,您不需要VPP。您可能需要澄清您试图做什么。我不确定原始提问者的项目,但我正在从程序集(预编译站点)检索ascx文件(嵌入式资源),从而使用VPP。另外,您能否澄清Entity1Item类型是在哪里定义的?它在什么程序集中?程序集中在哪里?卢基弗:是的,如果您的ascx不在文件系统中,VPP是有意义的。但是这里的问题似乎更多地与包含基类的程序集有关,而不是与ascx本身有关。