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

同一解决方案下跨项目利用反射获取目标程序集版本的方法

问题描述

我写了一段代码用来跟踪解决方案版本,但获取程序集版本的代码放在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>&copy; @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>&copy; @DateTime.Now.Year - @VersionHelper.GetAssemblyVersion(typeof(IndexModel).Assembly)</p>
</footer>

这种方法无需Utility项目引用Web项目,完全由调用方指定目标程序集,灵活性最高。

内容的提问来源于stack exchange,提问作者Mark Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:46:06