我正在尝试构建一个ASP.NET自定义服务器控件,该控件显示有关ASP.NET项目的版本信息,该项目包含呈现服务器控件的页面。
获取ASP.NET项目程序集的C#语法是什么?
也就是说,在自定义服务器控件的代码中使用此OnInit覆盖...
protected override void OnInit(EventArgs e) {
System.Reflection.Assembly assembly = Foo();
}
...... Foo()中的内容是什么?
编辑:自定义服务器控件是在类库项目/程序集中定义的,而不是ASP.NET项目/程序集。
答案 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方法就可以返回所需的程序集。