BuildManager解析页面继承

时间:2009-07-29 10:21:14

标签: c# .net asp.net compilation

我编写了一个VirtualPathProvider来改变aspx页面加载到ASP.Net应用程序的方式。作为此过程的一部分,我删除了Code-Behind文件,我只是确定我的页面继承自特定的页面类。 例如:

<%@ Page Language="C#" AutoEventWireup="true" Inherits="Namespace.PageClass" %>

如果我这样做,我会得到以下例外:

  

HttpParseException无法加载类型   'Namespace.PageClass'

我也尝试了以下内容:

<%@ Page Language="C#" AutoEventWireup="true" Inherits="Namespace.PageClass, AssemblyName" %>

这会产生以下错误:

  

HttpParseException   无法加载程序集   '的AssemblyName'。确保它是   在访问页面之前编译。

当应用程序启动时,我将所需的Assembly加载到当前的App域中:

AppDomain.Current.Load(...)

目前我假设问题在于BuildManager能够解析命名空间/程序集参考....但如果诚实......这是一个猜测: - )

有人能够对此有所了解吗?

2 个答案:

答案 0 :(得分:2)

您的网页必须使用完整的指定班级位置 - 即Inherits="MyNamespace.MyClass, MyAssembly"

然后将程序集加载到appDomain中将不会帮助AppDomain解决它。它不会遍历动态加载的程序集。因此,您必须订阅AppDomain.ResolveAssembly事件。

private Assembly myDynamicAssembly = null;

protected void Application_Start( object sender, EventArgs e )
{
      myDynamicAssembly = Assembly.LoadFrom( Server.MapPath( "MyLocation/MyAssembly.dll" ) );

      AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler( CurrentDomain_AssemblyResolve );
}

Assembly CurrentDomain_AssemblyResolve( object sender, ResolveEventArgs args )
{
      if ( args.Name == "MyAssembly" )
      {
           return myDynamicAssembly;
      }

      return null;
}

你已经完成了。现在,运行时知道如何从这个动态加载的程序集中解析类。

答案 1 :(得分:0)

可能的原因:

  1. 如果您在.aspx页面或Global.asax页面中引用模块后面的任何代码并且Web应用程序尚未构建,则会出现此错误。只需再次构建应用程序,并确保其中一个Web应用程序程序集中可以使用Namespace.PageClass类型。

    使用@Assembly指令在编译时将程序集链接到aspx页面。

    @ Assembly Name =“assemblyname”Src =“pathname”使所有程序集的类和接口可供使用。

  2. 2.出现此类错误的另一个原因可能是IIS中配置的错误版本的ASP.NET。 在IIS中选择正确的ASP.NET版本

    1. 转到“开始”菜单,单击“运行”(或使用“Win Key + R”)

    2. 键入INetMgr并按Enter键以打开Internet信息服务应用程序

    3. 展开显示本地计算机名称的树节点并导航到网站 - &gt;默认网站

    4. 右键单击“默认网站”节点,然后选择弹出菜单选项“属性”

      5.导航到属性页面中的ASP.NET选项卡并设置正确/最新版本。