You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在被引用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:15:00