我使用
this question中提到的自动生成版本(不是选择的答案,而是使用[assembly:AssemblyVersion(“1.0。*”)]技术的答案。我这样做在我的Site.Master文件在MVC 2的脚注。我的代码为这样做如下:
<div id="footer"> <a href="emailto:webmaster@foo.com">webmaster@foo.com</a> - Copyright © 2005-<%= DateTime.Today.Year.ToString() %>,foo LLC. All Rights Reserved. - Version: <%= Assembly.GetEntryAssembly().GetName().Version.ToString() %> </div>
我得到的异常是一个Object引用未设置为对象的实例,因为GetEntryAssembly()返回NULL。我的其他选项也不工作。 GetCallingAssembly()总是返回“4.0.0.0”和GetExecutingAssembly()总是返回“0.0.0.0”。当我去看看我的DLL,一切都是版本控制,如我所料。但我不知道如何访问它显示在我的页脚!
解决方法
这是因为Assembly.GetEntryAssembly()返回null:在ASP.NET网站中没有“条目”程序集(因为.NET框架托管在w3wp.exe进程中)。 Assembly.GetEntryAssembly()用于获取您启动的.exe程序集(通常在控制台或Windows应用程序中)
原因Assembly.GetAssembly(this.GetType())返回一个版本为“0.0.0.0”的程序集是因为ASP.NET将您的Site.Master文件编译为“ASP.NET临时文件”文件夹下的临时程序集。这是一个对“生成”类的引用。
Assembly.GetExecutingAssembly()基本上与Assembly.GetAssembly(this.GetType())相同(除了它也适用于没有“this”(例如在静态方法)。
最好的方法是使用显式性,使用你知道存在于你之后的程序集中的类型。例如,我假设你的“Site.Master”有一个代码隐藏文件,编译到程序集中。您可以改用:
Assembly.GetAssembly(typeof(Site)).GetName().Version.ToString()
(假设类的名称是Site)