我通常使用(流畅的)代码注册组件,但我现在需要通过XML注册某些类型。该文件如下所示: -
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<components>
<component service="MyNamespace.IFoo, MyAssembly"
type="MyNamespace2.ConcreteFoo, MyAssembly2"
lifestyle="transient" />
</components>
</configuration>
我使用以下代码注册类型: -
container.Install(
Castle.Windsor.Installer.Configuration.FromXmlFile(filename));
然而,这会因Castle.MicroKernel.SubSystems.Conversion.ConverterException
: -
无法将字符串'MyNamespace2.ConcreteFoo,MyAssembly2'转换为类型。程序集MyAssembly2,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null匹配,但它不包含类型。确保类型名称没有输入错误。
为了确保我没有发疯,我在上一行之前添加了这段代码: -
var test = AppDomain.CurrentDomain.GetAssemblies();
断点确认有问题的程序集位于当前的AppDomain中,所讨论的具体类型位于此程序集的“DefinedTypes”中。它也是公开的。
这应该是一件很简单的事情,但我现在正在摸不着头脑!
修改
我应该指出包含具体类型的程序集在运行时加载(使用MEF),并且存在于应用程序的exe的不同文件夹中(所以我不能在我的XML文件中使用<using>
) 。但是我假设它存在于AppDomain中,那么我正在做的事情应该可行。或者Windsor做了一些奇怪的事情,比如尝试再次从文件加载程序集,而不仅仅是查看AppDomain?
修改2
作为一项实验,我刚试过这行代码: -
container.Register(Classes.FromAssemblyNamed("MyAssembly2").BasedOn<IFoo>());
这会抛出一个FileNotFoundException,备份我之前的预感,即Windsor正在尝试从文件加载程序集而不是检入AppDomain。这是为什么?