.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 核心应用程序?