【问题标题】:BuildManager Resolving Page InheritanceBuildManager 解析页面继承
【发布时间】:2009-07-29 10:21:14
【问题描述】:

我编写了一个 VirtualPathProvider 来更改 aspx 页面加载到我的 ASP.Net 应用程序中的方式。作为此过程的一部分,我已经删除了代码隐藏文件,我只是在确认我的页面继承自特定页面类。 例如:

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

如果我这样做,我会得到以下异常:

HttpParseException 无法加载类型 '命名空间.PageClass'

我还尝试了以下方法:

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

这会产生以下错误:

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

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

AppDomain.Current.Load(...)

目前我假设问题在于 BuildManager 解决命名空间/程序集引用的能力......但如果老实说......这是一个猜测 :-)

有人能解释一下吗?

【问题讨论】:

  • nope - 这一切都发生在 System.Web 中,因为页面被解析......我没有堆栈跟踪:-(

标签: c# .net asp.net compilation


【解决方案1】:

您的页面必须使用完整的指定课程位置 - 即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;
}

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

【讨论】:

  • Ivan,谢谢 - 这让我向前迈了一步 - 但只是一小步!我现在收到一个编译错误:CS0400:在全局命名空间中找不到类型或命名空间名称“命名空间”(您是否缺少程序集引用?) public class default_aspx : global::Namespace.PageClass 有什么想法吗?跨度>
  • 请您发布错误的来源。我无法复制这个。
  • 嗨,Ivan,我创建了另一个问题(带有完整的源代码示例)来进一步解决这个问题 - 感谢您到目前为止的帮助。新问题在这里:stackoverflow.com/questions/1206634/…
【解决方案2】:

可能的原因:

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

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

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

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

  1. 进入开始菜单,点击运行(或者使用 Win Key + R )

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

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

  4. 右键单击默认网站节点并选择弹出菜单选项属性

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

【讨论】:

  • Pradeepneo - 谢谢,但不幸的是没有这样做。这些程序集在运行时动态加载,因此我无法使用 @Assembly 指令将它们指向正确的位置。同样,@Assembly 指令不是用于解析子控件引用 - 不是页面继承吗?我目前使用:AppDomain.Current.Load(...) 在 Application_Start 动态加载程序集。我认为这就是我需要做的所有事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多