Замок Виндзор не может найти System.Messaging - PullRequest
0 голосов
/ 16 ноября 2010

Я понимаю, что этот вопрос очень похож на этот , но, к сожалению, он не решает мою проблему.

У меня есть консольное приложение со следующим в моем разделе конфигурации замка:

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

Изначально я получил исключение «Не удалось найти имя типа System.Messaging.IMessageFormatter, System.Messaging».при обновлении моего WindsorContainer, например, так:

var container = new WindsorContainer(new XmlInterpreter());

Я установил для параметра Копировать локально значение true в System.Messaging.Это работает, когда я нажал F5.Однако, когда я публикую свое консольное приложение и запустил его на рабочей коробке, у меня возникла та же проблема.Я не вижу dll System.Messaging в папке ApplicationFiles после установки, возможно потому, что он думает, что он находится в GAC.

Я пытался скопировать dll в эту папку, но все равно не радости.

Есть идеи, что мне не хватает?Это даже хорошая идея, чтобы указать сборку системы в качестве службы?

Ответы [ 2 ]

1 голос
/ 16 ноября 2010

Попробуйте использовать полное имя типа:

<component id='LegacyMessageFormatter' 
service='System.Messaging.IMessageFormatter, System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 
type='...'/>
0 голосов
/ 16 ноября 2010

Windsor не ищет типы в системных сборках, как вы можете видеть здесь https://github.com/castleproject/Castle.Windsor/blob/master/src/Castle.Windsor/MicroKernel/SubSystems/Conversion/TypeNameConverter.cs#L170

явно пропускает типы, определенные в сборках с именем, начинающимся с 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">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...