如何在运行时根据进程位数加载不同的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
相关产品推荐
相关产品推荐

