.NET 程序集如何在 IIS ASP.NET 上下文中检测自己的版本?

Posted

技术标签:

【中文标题】.NET 程序集如何在 IIS ASP.NET 上下文中检测自己的版本?【英文标题】:How can a .NET assembly detect its own version within an IIS ASP.NET context? 【发布时间】:2021-11-07 03:44:27 【问题描述】:

我有一个在 winforms 应用程序中运行良好的 c# 函数来检测其容器 DLL 的版本,如 AssemblyInfo.cs 中的标记:

private string getVersion() 
  System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
  FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
  string tempFileVersion = fvi.FileVersion;

  if (tempFileVersion.EndsWith(".0")) 
    return tempFileVersion.Substring(0, tempFileVersion.Length - 2);
   else 
    return tempFileVersion;
  

问题是,这个函数在 IIS 中作为 ASP.NET webapp 的一部分被调用时会引发异常。我假设它归结为权限问题,但有没有办法让函数在 IIS 上下文中询问它所在的“你的版本是什么”中的 DLL?

【问题讨论】:

该代码不是返回程序集的版本,而是返回执行程序集的版本,在 IIS ASP.NET 的情况下是网页。如果您想拥有特定程序集的版本,则不应使用 GetExecuting Assembly。在其中获取一个类型(typeof)并从那里获取程序集引用。 你试过GetExecutingAssembly().GetName().Version吗? Link 你根本不需要使用反射。只需在程序集中的某处创建一个常量,并在 getVersion 方法和 AssemblyFileVersion 属性中使用它的值。 Steeeve - 不,单点真理更好。那么会有 2 个地方存放该版本。 @HerrimanCoder 这将是一个地方 - 您定义的常量。 class VersionInfo const string VersionString="1.0.0.0"; 你的方法 string getVersion => VersionInfo.VersionString; 和 AssemblyInfo.cs [AssemblyFileVersion(VersionInfo.VersionString)] 【参考方案1】:

超简单的解决方案来自 Steeeve:

添加新类:

public static class VersionInfo 
   public const string VersionString = "1.0";

修改2行AssemblyInfo.cs:

[assembly: AssemblyVersion(VersionInfo.VersionString)]
[assembly: AssemblyFileVersion(VersionInfo.VersionString)]

现在,我的 DLL 中需要在运行时知道其版本的任何其他地方都可以简单地调用 VersionInfo.VersionString,而无需求助于混乱和昂贵的反射。

【讨论】:

以上是关于.NET 程序集如何在 IIS ASP.NET 上下文中检测自己的版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Web 应用程序(ASP.Net、C#、IIS)中进行文件上传

如何配置 IIS,使我在同一台机器上运行的 ASP.NET Web 应用程序可以互相 POST,但公众不能 POST?

如何在 Windows 上更新正在运行的 asp.net 核心应用程序?

ASP.NET Core部署系列一:发布到IIS上

如何将针对 net452 项目的 ASP.NET Core 部署为 IIS 中网站的 IIS 应用程序

如何将 ASP.NET 2.0 注册到 Web 服务器(IIS7)?