WCF集成Autofac时AssemblyResolve事件未触发的问题求助
问题分析与解决方案
核心问题:AssemblyResolve事件注册时机过晚
你当前的写法是在Autofac注册的第一个类的构造函数里添加AssemblyResolve事件,但Autofac在构建容器、解析组件类型的阶段就已经需要加载Assembly1和Assembly2了——这时候你的构造函数还没执行,事件根本没挂上,自然无法触发,导致CLR找不到程序集直接报错。
解决方案:提前注册程序集解析事件
必须把AssemblyResolve事件的注册放到应用启动的最早阶段,确保Autofac开始处理依赖前,事件已经生效。
1. 根据托管方式选择注册时机
IIS托管的WCF服务:在
Global.asax的Application_Start方法中注册事件,再初始化Autofac容器:protected void Application_Start(object sender, EventArgs e) { // 第一步:先注册程序集解析事件 AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; // 第二步:再构建Autofac容器并赋值 var builder = new ContainerBuilder(); // 注册你的服务组件(示例) builder.RegisterType<YourWcfService>().AsSelf(); var container = builder.Build(); AutofacHostFactory.Container = container; }自托管WCF服务:在
Main方法的最开头注册事件:static void Main(string[] args) { AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; // 后续初始化Autofac和WCF宿主 var builder = new ContainerBuilder(); builder.RegisterType<YourWcfService>(); var container = builder.Build(); AutofacHostFactory.Container = container; // 启动WCF服务宿主 using (var host = new ServiceHost(typeof(YourWcfService))) { host.Open(); Console.WriteLine("服务已启动"); Console.ReadLine(); } }
2. 实现可靠的程序集解析方法
确保ResolveAssembly能正确定位并加载目标系统上的程序集:
private Assembly ResolveAssembly(object sender, ResolveEventArgs args) { var assemblyName = new AssemblyName(args.Name); // 从配置文件读取目标路径(推荐)或使用固定路径 string targetAssemblyDir = ConfigurationManager.AppSettings["TargetAssemblyPath"]; string assemblyFilePath = Path.Combine(targetAssemblyDir, $"{assemblyName.Name}.dll"); if (File.Exists(assemblyFilePath)) { // 加载指定路径的程序集 return Assembly.LoadFrom(assemblyFilePath); } // 找不到则返回null,让CLR继续默认查找逻辑 return null; }
3. 额外注意事项
- 权限检查:确保WCF服务的运行账户拥有目标程序集路径的读取权限
- 强名称处理:如果目标程序集是强名称版本,需确保加载的版本能满足CLR的绑定要求;若版本差异大,可配合配置文件的
bindingRedirect(但你的场景更适合用AssemblyResolve直接加载目标版本) - 测试验证:PostBuildEvent删除bin目录下的Assembly1/Assembly2后,确认目标路径存在对应程序集,再启动服务测试
内容的提问来源于stack exchange,提问作者user1542652
相关产品推荐
相关产品推荐

