如何在被引用的Sub类库项目中获取主Main项目的版本号
解决方案
方法1:直接获取入口程序集(最简便)
.NET 原生提供的 Assembly.GetEntryAssembly() 会返回当前应用程序域的启动入口程序集,也就是你的Main项目生成的可执行文件对应的程序集,完全不需要硬编码任何路径。
using System.Reflection; // Sub项目控件内直接调用即可 Version mainVersion = Assembly.GetEntryAssembly().GetName().Version;
注意事项:如果你的控件会在单元测试场景下使用,此时入口程序集会是单元测试框架的执行程序,不是你的Main项目,这种场景可以使用第二种方法。
方法2:依赖注入(最灵活,适配所有场景)
通过接口抽象解耦,完全避免循环依赖,同时兼容自定义版本号获取逻辑。
- 第一步:在Sub项目中定义版本提供接口
// Sub项目内定义 public interface IAppVersionProvider { Version GetCurrentVersion(); }
- 第二步:在Main项目中实现这个接口
// Main项目内实现,因为Main已经引用Sub,可直接使用Sub定义的接口 using System.Reflection; using SubNamespace; public class AppVersionProvider : IAppVersionProvider { public Version GetCurrentVersion() { return Assembly.GetExecutingAssembly().GetName().Version; } }
- 第三步:应用启动时将实现注册到DI容器中(以微软官方DI容器为例)
// Main项目App启动时的服务注册代码 services.AddSingleton<IAppVersionProvider, AppVersionProvider>();
- 第四步:Sub项目的控件中注入该接口使用
// Sub项目的UserControl构造函数注入 public partial class VersionDisplayControl : UserControl { public VersionDisplayControl(IAppVersionProvider versionProvider) { InitializeComponent(); VersionLabel.Text = versionProvider.GetCurrentVersion().ToString(); } }
该方案优势:不存在任何硬编码逻辑,无循环依赖风险,即使后续版本号需要从配置文件、应用打包信息等其他来源获取,只需要修改Main项目的实现即可,不需要改动Sub项目的任何代码。
方法3:非DI场景备选方案
如果你的项目没有使用依赖注入,可以通过查找当前应用域中包含入口点的程序集实现,效果和第一种方法一致:
using System.Linq; using System.Reflection; var mainAssembly = AppDomain.CurrentDomain.GetAssemblies() .FirstOrDefault(a => a.EntryPoint != null); Version mainVersion = mainAssembly?.GetName().Version ?? new Version(0,0,0,0);
内容的提问来源于stack exchange,提问作者Mc_Topaz
相关产品推荐
相关产品推荐

