Dependency injection Castle Windsor找不到系统。正在发送消息

Dependency injection Castle Windsor找不到系统。正在发送消息,dependency-injection,castle-windsor,Dependency Injection,Castle Windsor,我意识到这个问题非常类似于,但不幸的是,它并不能完全解决我的问题 我有一个控制台应用程序,在我的castle配置部分中包含以下内容: <component id="LegacyMessageFormatter" service="System.Messaging.IMessageFormatter, System.Messaging" type="MsmqLogProcessor.Core.Services.LegacyMessageForm

我意识到这个问题非常类似于,但不幸的是,它并不能完全解决我的问题

我有一个控制台应用程序,在我的castle配置部分中包含以下内容:

<component id="LegacyMessageFormatter" 
           service="System.Messaging.IMessageFormatter, System.Messaging" 
           type="MsmqLogProcessor.Core.Services.LegacyMessageFormatter, MsmqLogProcessor.Core"/>
我已在System.Messaging中将Copy Local设置为true。当我按F5时,它就起作用了。 然而,当我发布我的控制台应用程序并在生产设备上运行它时,我会遇到同样的问题。安装后,我无法在ApplicationFiles文件夹中看到System.Messaging dll,可能是因为它认为它在GAC中

我尝试过将dll复制到这个文件夹中,但仍然没有乐趣


你知道我错过了什么吗?将系统程序集指定为服务是一个好主意吗

Windsor不查找系统部件中的类型,如您在此处所见

它显式跳过名称以System开头的程序集中定义的类型

不知道为什么,但您可以使用自己的ConversionManager来解决这个问题

public class MyConversionManager : DefaultConversionManager
{
    protected override void InitDefaultConverters()
    {
        Add(new SystemMessaging_TypeConverter(new TypeNameParser()));

        base.InitDefaultConverters();
    }
}

public class SystemMessaging_TypeConverter : TypeNameConverter
{
    public SystemMessaging_TypeConverter(ITypeNameParser parser) : base(parser)
    {
    }

    protected override bool ShouldSkipAssembly(System.Reflection.Assembly assembly)
    {
        return !assembly.FullName.StartsWith("System.Messaging") && base.ShouldSkipAssembly(assembly);
    }
}
并将其安装在容器中,如下所示:

    var container = new WindsorContainer();

    container.Kernel.AddSubSystem(SubSystemConstants.ConversionManagerKey, new MyConversionManager());

    container.Install(Configuration.FromAppConfig());
然后注册服务,但不注册程序集名称:

<component id="LegacyMessageFormatter"
service="System.Messaging.IMessageFormatter"
type="MsmqLogProcessor.Core.Services.LegacyMessageFormatter, MsmqLogProcessor.Core">

尝试使用完全限定的类型名称:

<component id='LegacyMessageFormatter' 
service='System.Messaging.IMessageFormatter, System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 
type='...'/>


非常好。谢谢你。我有一种感觉,这与Castle忽略系统类型有关,但我对Castle的胆识了解不够,无法理解。现在试试这个…呜呜。成功了!比使用自己的ConversionManager更优雅。干杯,伙计。顺便问一下,使用完全限定类型名的意义是什么?为什么这会有不同?
<component id='LegacyMessageFormatter' 
service='System.Messaging.IMessageFormatter, System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 
type='...'/>