2011-10-14 29 views
0

我想構建一個ASP.NET自定義服務器控件,該控件顯示有關包含呈現服務器控件的頁面的ASP.NET項目的版本信息。從自定義服務器控件的OnInit獲取ASP.NET程序集?

獲取該ASP.NET項目的程序集的C#語法是什麼?

也就是說,給定這個OnInit的自定義服務器控件的代碼中覆蓋...

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

...在發生什麼美孚()?

編輯:自定義服務器控件是在類庫項目/程序集中定義的,它不是ASP.NET項目/程序集。

回答

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

無論身在何處控件的實現,一個單獨的DLL或當前之一,它會在年底Page類實例化,並添加到其控件集合。這個頁面可以通過Page方法訪問,並基於這個方法找到程序集。
對於.aspx文件(實際上它們中的幾個如果更多),ASP .Net創建一個dll。如果「繼承」屬性設置,然後將生成的類看起來像:

public _Default_aspx : Namespace._Default, IHttpHandler { 
} 

此DLL是一個比由Visual Studio,一個「Web應用程序項目」的結果編制不同,我想你更感興趣的是最新的。這個DLL有「_Default:類型,我們在Visual Studio中看到:

public _Default : System.Web.Page 
{ 
} 

那麼,爲什麼這個小故事當this.Page.GetType()從服務器控件調用,那麼,如果繼承屬性?這個方法會返回_Default_aspx類型,但是對於你來說是沒用的,因爲你需要由Visual Studio創建的程序集,而不是從aspx/ascx文件中的ASP.Net生成的程序集。如果頁面或控件的Inherit屬性設置了,GetType()就足夠了。
知道了類型,只需調用Assembly.GetAssembly方法就可以返回你需要的程序集組。

+0

我從以前的版本中看到你已經是foun d如何獲取程序集版本 –

+0

調用Assembly.GetExecutingAssembly()爲我提供了定義自定義服務器控件的程序集,而不是ASP.NET程序集(這是兩個不同的程序集,這是我現在只包含在其中的一個重要事實)問題 - 抱歉)。 – lance

+0

GetCallingAssembly –

相關問題