我创建了一个方法来获取当前页面的程序集名称和版本,以便我可以在页脚中显示它。它运行得很好,但我想将这个逻辑移动到一个控件中,我可以将其放入任何引用我的控件库的Web应用程序项目母版页中。但是,在控件库中Assembly.GetExecutingAssembly()
返回控件库程序集,而不是Web项目程序集。
以下是方法:
private string GetVersion()
{
const string cacheKey = "Web.Controls.ApplicationVersion";
string version = (string) Page.Cache[cacheKey];
if (version == null)
{
Assembly assembly = Assembly.GetExecutingAssembly();
// get the assembly version
Version assemblyVersion = assembly.GetName().Version;
// get the product name
string productName;
AssemblyProductAttribute productAttribute =
assembly.GetCustomAttributes(typeof (AssemblyProductAttribute), false).Cast
<AssemblyProductAttribute>().FirstOrDefault();
if (productAttribute != null)
{
productName = productAttribute.Product;
}
else
{
productName = String.Empty;
}
version = String.Format("{0} {1}", productName, assemblyVersion);
Page.Cache[cacheKey] = version;
}
return version;
}
我也尝试过返回null的Assembly.GetEntryAssembly()
和返回控件程序集的Assembly.GetCallingAssembly()
。最后我尝试了Assembly.GetAssembly(Page.GetType())
,它返回在运行时生成的页面类型(ASP.abc)。
如何从Control的上下文中获取Web项目程序集,而不是通过名称明确请求它?
答案 0 :(得分:1)
也许不及时。但今天我遇到了同样的问题。首先我发现的是你的问题没有答案(后来我在这个问题上挖掘。
答案是:Assembly.GetAssembly(Page.GetType().BaseType)
原因是如上所述,在运行时生成页面类型。 我在MSDN中找到了很好的解释:
特定页面的HTTP处理程序的类型取决于URL。 第一次调用URL时,将组成一个新类 动态编译为程序集。该类的源代码是 检查.aspx源的解析过程的结果。该 class被定义为命名空间ASP的一部分,并给出了一个名称 模仿原始网址。例如,如果URL端点是 page.aspx,该类的名称是ASP.Page_aspx。班级名称, 但是,可以通过设置ClassName以编程方式控制 @Page指令中的属性。
HTTP处理程序的基类是Page。这个类定义了 所有页面处理程序共享的最小方法和属性集。该 Page类实现了IHttpHandler接口。
在几种情况下,实际处理程序的基类 不是Page而是一个不同的类。例如,如果发生这种情况 使用代码隐藏。代码隐藏是一种开发技术 将页面所需的代码隔离到单独的C#或Microsoft中 VisualBasic®.NET类。页面的代码是事件集 实际创建行为的处理程序和帮助程序方法 页。可以使用内联函数定义此代码 标记或放置在外部类中 - 代码隐藏类。一个 代码隐藏类是一个继承自Page和specialized的类 它有额外的方法。指定时,使用代码隐藏类 作为HTTP处理程序的基类。
因此,当您使用Page.GetType()
时,您将获得动态组合类。这个类继承自实际的页面类,这个类是进入项目组装的。
http://msdn.microsoft.com/en-us/library/aa479007.aspx -MSDN文章引用。