IIS ASP.NET环境下.NET程序集如何获取自身版本号
问题原因分析
原代码报错的核心原因有两个:
FileVersionInfo.GetVersionInfo()需要读取磁盘上的DLL实体文件,而IIS应用池的默认运行身份(比如IIS AppPool\对应应用池名)对站点bin目录的文件默认仅授予执行权限,没有文件读取权限,会触发权限异常。- ASP.NET动态编译场景下,
Assembly.Location可能返回临时编译目录的路径,读取到的版本信息也不是目标DLL的实际版本。
可行解决方案
不需要修改IIS权限,直接从程序集的元数据中读取版本信息即可,该方式完全不需要访问磁盘文件,兼容WinForms和ASP.NET/IIS环境:
如果你需要读取AssemblyVersion(AssemblyInfo.cs中标记的程序集版本)
private string getVersion() { System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); string tempFileVersion = assembly.GetName().Version.ToString(); if (tempFileVersion.EndsWith(".0")) { return tempFileVersion.Substring(0, tempFileVersion.Length - 2); } else { return tempFileVersion; } }
如果你需要读取AssemblyFileVersion(AssemblyInfo.cs中标记的文件版本)
private string getVersion() { System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); var fileVersionAttr = assembly.GetCustomAttribute<System.Reflection.AssemblyFileVersionAttribute>(); string tempFileVersion = fileVersionAttr.Version; if (tempFileVersion.EndsWith(".0")) { return tempFileVersion.Substring(0, tempFileVersion.Length - 2); } else { return tempFileVersion; } }
备选方案(不推荐)
如果一定要沿用原FileVersionInfo的实现逻辑,可以手动给站点bin目录添加对应IIS应用池运行身份的读取和执行权限即可解决异常,但会带来额外的权限配置成本和安全风险。
内容的提问来源于stack exchange,提问作者HerrimanCoder
相关产品推荐
相关产品推荐

