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

如何在运行时根据进程位数加载不同的C#程序集?

解决CLR加载指定架构DLL的问题

核心原因

直接调用Assembly.LoadFrom加载程序集,仅会将其载入内存,但当代码引用该程序集的类型时,CLR仍会遵循默认程序集探测规则(从应用程序基目录、配置文件指定的私有路径等)查找匹配程序集,因此会优先找到x64版本。

可行解决方案

1. 订阅程序集解析事件拦截加载请求

通过AppDomain.CurrentDomain.AssemblyResolve事件,在CLR找不到目标程序集时,手动返回指定的x86版本程序集。代码示例:

var baseDirectory = AppDomain.CurrentDomain.BaseDirectory;

// 需在引用该程序集的代码执行前注册事件
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
    if (!Environment.Is64BitProcess)
    {
        var assemblyName = new AssemblyName(args.Name);
        if (assemblyName.Name.Equals("Bibliothek", StringComparison.OrdinalIgnoreCase))
        {
            var assemblyPath = Path.Combine(baseDirectory, "Assemblies32", "Bibliothek.dll");
            return Assembly.LoadFrom(assemblyPath);
        }
    }
    return null; // 返回null让CLR继续执行默认加载逻辑
};

2. 修改应用配置文件指定私有探测路径

在App.config或Web.config中添加probing节点,让CLR在x86环境下优先搜索Assemblies32目录:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="Assemblies32" />
    </assemblyBinding>
  </runtime>
</configuration>

若需区分架构,可使用架构特定配置文件(如App.x86.config),让x86进程启动时自动加载对应配置。

3. 加载程序集字节流(无上下文加载)

跳过文件路径依赖,直接读取程序集字节流加载,适用于无复杂依赖的独立程序集:

if (!Environment.Is64BitProcess)
{
    var assemblyPath = Path.Combine(baseDirectory, "Assemblies32", "Bibliothek.dll");
    var assemblyBytes = File.ReadAllBytes(assemblyPath);
    Assembly.Load(assemblyBytes);
}

额外注意事项

  • 确认Assemblies32目录下的Bibliothek.dll为纯x86编译版本,与当前进程架构匹配。
  • 若程序集带有强名称,需保证加载版本、公钥令牌等与代码引用的完全一致,否则CLR会拒绝加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 12:18:25