从自定义服务器控件的OnInit获取ASP.NET程序集?

时间:2011-10-14 16:29:15

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

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

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

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

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

...... Foo()中的内容是什么?

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

1 个答案:

答案 0 :(得分:1)

 public Assembly GetPageAssembly()
 {
   var pageType = Page.GetType();
   return Assembly.GetAssembly(pageType.BaseType == null 
                                || pageType.BaseType == typeof (Page)
                                     ? pageType : pageType.BaseType);
 }

无论控件的实现位于何处,单独的dll或当前的dll,它最终将在Page类中实例化并添加到其Controls集合中。可以通过Page方法访问此页面,并在此基础上找到该程序集。
对于.aspx文件(实际上是其中几个),ASP .Net创建一个dll。如果设置了“Inherit”属性,则生成的类将类似于:

public _Default_aspx : Namespace._Default, IHttpHandler {
}

这个dll与Visual Studio编译的dll不同,后者是“Web应用程序项目”的结果,我想你最感兴趣的是最新版本。这个dll有“_Default:type,我们在Visual Studio中看到:

public _Default : System.Web.Page
{
}

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