.NET Framework 4.8下DI与Npgsql冲突:System.Threading.Tasks.Extensions加载错误解决问询
解决.NET Framework 4.8 AutoCAD应用中DI与Npgsql的程序集冲突问题
1. 统一更新相关NuGet包
- 先把
System.Threading.Tasks.Extensions更到最新稳定版(比如4.5.4),高版本通常自带向下兼容逻辑。然后重新安装DI和Npgsql包,避免版本残留:Uninstall-Package Microsoft.Extensions.DependencyInjection -Force Uninstall-Package Npgsql -Force Uninstall-Package System.Threading.Tasks.Extensions -Force Install-Package System.Threading.Tasks.Extensions -Version 4.5.4 Install-Package Npgsql Install-Package Microsoft.Extensions.DependencyInjection
2. 修正程序集绑定重定向配置
- 注意AutoCAD插件的配置文件必须和插件程序集同名(比如
YourPlugin.dll.config),且放在插件目录下才会生效。在配置里覆盖全版本范围的重定向:<dependentAssembly> <assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.1" /> <!-- 替换成你实际安装的版本号 --> </dependentAssembly>
3. 手动接管程序集加载逻辑
- 在AutoCAD插件的初始化方法里注册
AssemblyResolve事件,强制加载正确路径的程序集:public class AutoCADPlugin : IExtensionApplication { public void Initialize() { AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; // 这里初始化DI容器 } private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { var assemblyName = new AssemblyName(args.Name); if (assemblyName.Name == "System.Threading.Tasks.Extensions") { // 替换成你项目里该dll的实际输出路径 string assemblyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "System.Threading.Tasks.Extensions.dll"); return Assembly.LoadFrom(assemblyPath); } return null; } public void Terminate() { } } - 确保
System.Threading.Tasks.Extensions.dll的NuGet属性设置为Copy Local = True,保证复制到输出目录。
4. 用融合日志查看器定位根源
- 启动
fuslogvw.exe(Visual Studio命令提示符里直接运行),开启“绑定失败日志记录”,重现错误后查看详细日志,确认是文件找不到、版本不匹配还是强名称验证失败,再针对性解决。
5. 降级DI包到.NET Framework兼容版本
- 部分新版
Microsoft.Extensions.DependencyInjection依赖高版本.NET Standard,在4.8里容易出问题,试试降级到3.1.x版本:Install-Package Microsoft.Extensions.DependencyInjection -Version 3.1.32
内容的提问来源于stack exchange,提问作者Nguyen Vung
相关产品推荐
相关产品推荐

