【问题标题】:Get ASP.NET assembly from OnInit of custom server control?从自定义服务器控件的 OnInit 获取 ASP.NET 程序集?
【发布时间】:2011-10-14 16:29:15
【问题描述】:

我正在尝试构建一个 ASP.NET 自定义服务器控件,它显示有关 ASP.NET 项目的版本信息,该项目包含呈现服务器控件的页面。

获取该 ASP.NET 项目的程序集的 C# 语法是什么?

也就是说,给定自定义服务器控件代码中的此 OnInit 覆盖...

protected override void OnInit(EventArgs e) {
    System.Reflection.Assembly assembly = Foo();
}

... Foo() 中发生了什么?

编辑:自定义服务器控件是在非 ASP.NET 项目/程序集的类库项目/程序集中定义的。

【问题讨论】:

    标签: c# asp.net assemblies custom-server-controls


    【解决方案1】:
     public Assembly GetPageAssembly()
     {
       var pageType = Page.GetType();
       return Assembly.GetAssembly(pageType.BaseType == null 
                                    || pageType.BaseType == typeof (Page)
                                         ? pageType : pageType.BaseType);
     }
    

    无论控件的实现在哪里,单独的dll还是当前的,最后都会在Page类中实例化并添加到它的Controls集合中。此页面可通过 Page 方法访问,并基于此找到程序集。
    对于一个 .aspx 文件(如果更多的话,实际上是其中的几个),ASP .Net 创建一个 dll。如果设置了“继承”属性,则生成的类将如下所示:

    public _Default_aspx : Namespace._Default, IHttpHandler {
    }
    

    这个 dll 与 Visual Studio 编译的不同,它是“Web 应用程序项目”的结果,我认为您对最新的更感兴趣。此 dll 具有我们在 Visual Studio 中看到的“_D​​efault: 类型:

    public _Default : System.Web.Page
    {
    }
    

    那么为什么要写这个短篇小说呢?当从服务器控件调用 this.Page.GetType() 时,如果设置了 Inherit 属性,则该方法将返回 _Default_aspx 类型,但对您无用,因为您需要 Visual Studio 创建的程序集而不是那个由 ASP .Net 从 aspx/ascx 文件生成。如果页面或控件设置了 Inherit 属性,则 GetType() 就足够了。
    知道类型后,只需调用 Assembly.GetAssembly 方法即可返回您需要的程序集。

    【讨论】:

    • 我从你以前的版本中看到你已经找到了如何获取汇编版本
    • 调用 Assembly.GetExecutingAssembly() 为我提供了定义自定义服务器控件的程序集,而不是 ASP.NET 程序集(这是两个不同的程序集,一个重要的事实我现在才包含在这个问题——对不起)。
    • 调用 Assembly.GetCallingAssembly() 给我的是 .NET System.Web 程序集,而不是我的 ASP.NET 项目的程序集。
    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多