.NET 6 ASP.NET Core Web API无法通过Windsor注册.NET Framework 4.8类库
问题:Castle Windsor在.NET Core Web API中无法加载程序集
场景描述
相同的组件注册代码在单元测试项目中运行正常,但在.NET Core Web API项目中报错。Web API项目的Program.cs代码如下:
var builder = WebApplication.CreateBuilder(args); // Add services to the container. IWindsorContainer container = new WindsorContainer(new XmlInterpreter("Windsor.config")); container.Resolve<IDataProvider>();
错误信息
Castle.MicroKernel.SubSystems.Conversion.ConverterException HResult=0x80131500 Message=Could not convert string 'MyProject.DataAccess.DataProviders.PDataProvider, MyProject.DataAccess, Version=1.0.0.0, Culture=neutral' to a type. Assembly was not found. Make sure it was deployed and the name was not mistyped. Source=Castle.Windsor StackTrace: at Castle.MicroKernel.SubSystems.Conversion.TypeNameConverter.GetType(String name) at Castle.MicroKernel.SubSystems.Conversion.TypeNameConverter.PerformConversion(String value, Type targetType) at Castle.MicroKernel.SubSystems.Conversion.DefaultConversionManager.PerformConversion(String value, Type targetType) at Castle.MicroKernel.SubSystems.Conversion.DefaultConversionManager.PerformConversion[TTarget](String value) at Castle.Windsor.Installer.DefaultComponentInstaller.SetUpComponents(IConfiguration[] configurations, IWindsorContainer container, IConversionManager converter) at Castle.Windsor.Installer.DefaultComponentInstaller.SetUp(IWindsorContainer container, IConfigurationStore store) at Program.<Main>$(String[] args) in C:\source\repos\F2\MyProject.F2\Program.cs:line 8
Windsor配置文件(Windsor.config)
<?xml version="1.0" encoding="utf-8" ?> <castle> <components> <component id="DataProvider" service="MyProject.Interfaces.DataProviders.IDataProvider, MyProject.Interfaces" type="MyProject.DataAccess.DataProviders.PDataProvider, MyProject.DataAccess, Version=1.0.0.0, Culture=neutral"></component> </components> </castle>
已尝试操作
- 手动将
MyProject.DataAccess.dll复制到Debug和Release的/bin目录 - 怀疑问题源于程序集位置未被Web API识别,或是.NET Framework 4.8版本兼容性问题
排查建议
校验程序集版本与配置匹配
右键MyProject.DataAccess.dll→属性→详细信息,确认实际版本、文化信息和配置中的Version=1.0.0.0, Culture=neutral完全一致,避免版本号或拼写错误。调整.NET Core程序集加载方式
.NET Core的程序集加载逻辑和.NET Framework不同,手动拷贝的DLL可能不在默认加载路径内:- 直接将
MyProject.DataAccess项目添加为Web API项目的引用,让构建系统自动管理依赖复制 - 代码中先手动加载目标程序集,再初始化Windsor容器:
var dataAccessDllPath = Path.Combine(AppContext.BaseDirectory, "MyProject.DataAccess.dll"); Assembly.LoadFrom(dataAccessDllPath); var container = new WindsorContainer(new XmlInterpreter("Windsor.config"));
- 直接将
确认Windsor版本兼容性
检查使用的Castle Windsor版本是否支持.NET Core,旧版本对.NET Core支持有限,建议升级到7.x及以上的稳定版本。简化配置中的程序集标识
暂时移除配置中的版本和文化信息,只保留程序集名称,排除因版本/文化不匹配导致的加载失败:<component id="DataProvider" service="MyProject.Interfaces.DataProviders.IDataProvider, MyProject.Interfaces" type="MyProject.DataAccess.DataProviders.PDataProvider, MyProject.DataAccess"> </component>检查程序集依赖完整性
使用dotnet list package或第三方依赖分析工具,检查MyProject.DataAccess.dll是否存在缺失的依赖项,.NET Core下缺失依赖也会引发加载失败。
内容的提问来源于stack exchange,提问作者codingjoe
相关产品推荐
相关产品推荐

