同一解决方案下跨项目利用反射获取目标程序集版本的方法
问题描述
我写了一段代码用来跟踪解决方案版本,但获取程序集版本的代码放在Utility项目里,而我需要跟踪的是Web项目的版本。不想把代码迁移到Web项目,怎么用反射查询同一解决方案里的另一个项目?
现有代码
Utilities\Helper.cs
namespace MyProject.Classes.Utilities; public class VersionHelper { private static string AssemblyVersion { get; set; } public static string GetAssemblyVersion() { if(AssemblyVersion == null) { AssemblyInformationalVersionAttribute infoVersion = (AssemblyInformationalVersionAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false).FirstOrDefault(); AssemblyVersion = infoVersion.InformationalVersion; } return AssemblyVersion; } }
MyWebProject\Web\pages\index.cshtml
<footer> <p>© @DateTime.Now.Year - @VersionHelper.GetAssemblyVersion()</p> </footer>
解决方案
Assembly.GetExecutingAssembly()只会获取当前Utility程序集的版本,要拿到Web项目的版本,需要定位到Web项目对应的程序集,以下是几种可行方案:
方法1:通过Web项目中的类型定位程序集
如果Utility项目可以引用Web项目中的某个类型(比如Web项目的控制器、模型类),可以通过该类型关联的程序集获取版本:
修改VersionHelper代码:
using System.Reflection; using MyWebProject.Web.Models; // 替换为Web项目实际存在的命名空间及类型 namespace MyProject.Classes.Utilities; public class VersionHelper { private static string AssemblyVersion { get; set; } public static string GetAssemblyVersion() { if(AssemblyVersion == null) { // 通过Web项目中的类型获取对应程序集 Assembly webAssembly = typeof(HomeModel).Assembly; AssemblyInformationalVersionAttribute infoVersion = webAssembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>(); AssemblyVersion = infoVersion?.InformationalVersion ?? "Unknown"; } return AssemblyVersion; } }
注意:需确保Utility项目能引用Web项目程序集,且运行时该程序集可被加载。
方法2:直接通过程序集名称加载
如果明确Web项目程序集的名称(比如MyWebProject.Web),可以直接加载目标程序集:
using System.Reflection; namespace MyProject.Classes.Utilities; public class VersionHelper { private static string AssemblyVersion { get; set; } public static string GetAssemblyVersion() { if(AssemblyVersion == null) { try { // 替换为Web项目实际程序集名称 Assembly webAssembly = Assembly.Load("MyWebProject.Web"); AssemblyInformationalVersionAttribute infoVersion = webAssembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>(); AssemblyVersion = infoVersion?.InformationalVersion ?? "Unknown"; } catch(FileNotFoundException) { AssemblyVersion = "Assembly not found"; } } return AssemblyVersion; } }
此方法需保证程序集名称准确,且运行时能找到该程序集文件。
方法3:由调用方传递目标程序集
在Web项目调用Helper方法时,主动传入当前Web程序集:
首先修改VersionHelper:
using System.Reflection; namespace MyProject.Classes.Utilities; public class VersionHelper { private static string AssemblyVersion { get; set; } // 新增重载方法,接受外部传入的程序集 public static string GetAssemblyVersion(Assembly targetAssembly) { if(AssemblyVersion == null) { AssemblyInformationalVersionAttribute infoVersion = targetAssembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>(); AssemblyVersion = infoVersion?.InformationalVersion ?? "Unknown"; } return AssemblyVersion; } // 保留原方法,兼容其他调用场景 public static string GetAssemblyVersion() { return GetAssemblyVersion(Assembly.GetExecutingAssembly()); } }
然后修改Razor页面的调用代码:
<footer> <p>© @DateTime.Now.Year - @VersionHelper.GetAssemblyVersion(typeof(IndexModel).Assembly)</p> </footer>
这种方法无需Utility项目引用Web项目,完全由调用方指定目标程序集,灵活性最高。
内容的提问来源于stack exchange,提问作者Mark Johnson
相关产品推荐
相关产品推荐

