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

如何在.NET Core中重定向程序集探测?(ASP.NET Core MVC部署场景)

嘿,针对你这种直接把App文件夹部署到IIS、用AspNetCoreModule托管的.NET Core 2.0 MVC场景,实现程序集探测重定向其实有几种实用的方式,我结合你的部署模式给你拆解清楚:

方法一:使用Runtime配置文件(无代码侵入,推荐)

.NET Core里的程序集重定向可以通过runtimeconfig相关文件来配置,完全不需要修改代码,很适配你的DevOps部署模式:

  1. 在项目根目录创建一个名为runtimeconfig.template.json的文件,这个文件会在构建时自动合并到输出目录的[你的应用名称].runtimeconfig.json中(不用担心构建覆盖的问题)。
  2. 在这个template文件里添加程序集重定向规则,示例如下:
{
  "runtimeOptions": {
    "assemblyBinding": {
      "dependentAssembly": [
        {
          "assemblyIdentity": {
            "name": "OldAssembly",
            "publicKeyToken": "32ab4ba45e0a69a1"
          },
          "bindingRedirect": {
            "oldVersion": "1.0.0.0-2.0.0.0",
            "newVersion": "2.1.0.0"
          }
        }
      ]
    }
  }
}
  1. 配置说明:
    • assemblyIdentity:指定你要重定向的目标程序集名称和公钥令牌(如果是强签名程序集的话)
    • bindingRedirect:定义需要重定向的旧版本范围,以及替换的新版本号

因为你已经配置好了AspNetCoreModule加载入口DLL,IIS托管时会自动读取这个runtime配置,重定向规则会直接生效。

方法二:自定义AssemblyLoadContext(灵活适配复杂场景)

如果配置文件的静态规则满足不了你的需求(比如需要根据环境动态调整重定向逻辑),可以通过代码自定义程序集加载上下文来拦截加载请求:

  1. 首先创建一个自定义的AssemblyLoadContext类:
using System;
using System.IO;
using System.Reflection;
using System.Runtime.Loader;

public class CustomAssemblyLoadContext : AssemblyLoadContext
{
    protected override Assembly Load(AssemblyName assemblyName)
    {
        // 针对特定程序集执行重定向逻辑
        if (assemblyName.Name.Equals("OldAssembly", StringComparison.OrdinalIgnoreCase))
        {
            // 指定要加载的新版本程序集的路径
            string targetAssemblyPath = Path.Combine(AppContext.BaseDirectory, "bin/NewAssembly.dll");
            return LoadFromAssemblyPath(targetAssemblyPath);
        }
        
        // 其他程序集使用默认加载逻辑
        return Default.LoadFromAssemblyName(assemblyName);
    }
}
  1. 在Program.cs的入口方法中注册这个自定义上下文:
public static void Main(string[] args)
{
    var customLoadContext = new CustomAssemblyLoadContext();
    // 拦截默认加载上下文的解析请求
    AssemblyLoadContext.Default.Resolving += (context, assemblyName) =>
    {
        return customLoadContext.Load(assemblyName);
    };

    CreateWebHostBuilder(args).Build().Run();
}

这种方式可以让你完全掌控程序集加载的逻辑,适合需要动态切换版本的复杂场景。

IIS部署的额外注意事项

  • 确保你重定向目标的新版本程序集已经部署到App文件夹的可访问路径下(比如bin目录或者应用根目录)
  • 如果程序集是强签名的,一定要保证assemblyIdentity里的publicKeyToken和实际程序集的令牌完全一致,否则重定向规则不会生效
  • .NET Core 2.x版本下,AspNetCoreModule会自动读取runtimeconfig的配置,不需要额外修改IIS站点的设置

内容的提问来源于stack exchange,提问作者mohammad rostami siahgeli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:17:39