在非MVC应用程序的网页上显示程序集版本

时间:2015-09-03 12:46:43

标签: c# asp.net razor

我们有一个不使用MVC的网络应用程序。此Web应用程序已在使用Assembly.cs。在我的C#代码中,我可以获得webapplication的版本号,但是如何在网页(.cshtml)中获取它?

我尝试使用

@System.Reflection.Assembly.GetExecutingAssembly().GetName();

但它返回

t0cxczo0, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

不是看起来很熟悉的东西。

当我使用

@typeof(MyApp.Application).Assembly.GetName()

它编译得很好,但在运行时我得到了

"Cannot find namespace MyApp"

MyApp是我的应用程序的名称,Application是我的一个类。

我也试过

@System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(MyApp.Application).Assembly.Location).ProductVersion

但是那也会返回"找不到命名空间MyApp"错误。

我的webapplication使用其他一些自制二进制文件,这些二进制文件可以在其他Web应用程序中重复使用。当我使用

@System.Reflection.Assembly.GetCallingAssembly().GetName()

我正在获取处理模板内容的其他程序集的名称和版本。所以我越来越近了;)

当我使用

@System.Reflection.Assembly.GetEntryAssembly().GetName()

我得到了一个"模板执行"错误

当我使用

@HttpContext.Current.ApplicationInstance

我收到有关HttpContext的错误并不存在。

请建议如何做到这一点应该是一件容易的事。

2 个答案:

答案 0 :(得分:2)

你试过这个吗?

在你的使用中

using System.Reflection
using System.Diagnostics

然后在你的c#代码中

Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fileVersionInfo.ProductVersion;

这就是我们目前在其中一个应用程序中使用的内容。然后我们获取变量“version”并将其分配给控件(webforms)或ViewBag变量。

如果您需要将其传递给ajax请求或从ajax请求传递,我建议您在c#代码中使用web方法。

[System.Web.Services.WebMethod]
public static string GetCurrentAssembly()
{
    Assembly assembly = Assembly.GetExecutingAssembly();
    FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
    string version = fileVersionInfo.ProductVersion;
  return version;
}

然后通过客户端调用它以使其可用于您的页面。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js" type="text/javascript"></script>
<script type = "text/javascript">
function ShowCurrentAssembly() {
    $.ajax({
        type: "POST",
        url: "CS.aspx/GetCurrentAssembly",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: OnSuccess,
        failure: function(response) {
            alert(response.d);
        }
    });
}
function OnSuccess(response) {
    alert(response.d);//you can replace this with code to populate an html element
}
</script>

进一步说明:http://www.aspsnippets.com/Articles/Calling-ASPNet-WebMethod-using-jQuery-AJAX.aspx

答案 1 :(得分:0)

它可能不是最通用的选项,但以下代码适用于我的情况:

var uri = new Uri(System.Reflection.Assembly.GetCallingAssembly().CodeBase);
var baseDir = System.IO.Path.GetDirectoryName(uri.LocalPath);
if (baseDir != null)
{
    var appLocation = System.IO.Path.Combine(baseDir, "MyApp.dll");
    version = System.Diagnostics.FileVersionInfo.GetVersionInfo(appLocation).FileVersion;
}

仅因为GetCallingAssembly是我bin文件夹中的另一个dll。