Как получить плагины, задав путь - PullRequest
0 голосов
/ 28 февраля 2012

Я создал консольный проект c #.и в коде я сделал модуль.Мой код выглядит следующим образом.

[Import]
public IMessageSender MessageSender { get; set; }

public static void Main(string[] args)
{
    Program p = new Program();
    p.Run();
}

public void Run()
{
    Compose();
    Console.ReadLine(MessageSender.Send("Message Sent"));
}

private void Compose()
{
    AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
    var container = new CompositionContainer(catalog);
    container.ComposeParts(this);
}

public interface IMessageSender
{
    string Send(string message);
}

[Export(typeof(IMessageSender))]
public class EmailSender : IMessageSender
{
    public void Send(string message)
    {
        return message;
    }
}

Он прекрасно работает.Но теперь я добавил новый проект в свое решение и добавил модуль в этот AnotherProject-> EmailSender.cs

[Export(typeof(IMessageSender))]
public class EmailSender : IMessageSender
{
    public void Send(string message)
    {
        return message;
    }
}

Теперь в программе основной консоли я изменил часть своего кода.

private void Compose()
{
    var catalog = new DirectoryCatalog(path);
    //AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
    var container = new CompositionContainer(catalog);
    container.ComposeParts(this);
}

Но теперь, когда я запускаю эту программу.Он не загружает модуль.MessageSender в основной программе является нулевым.Что не так я сделал.

1 Ответ

0 голосов
/ 28 февраля 2012

Есть несколько вещей, которые необходимо проверить:

  1. Правильно ли вы ссылались на сборки?
  2. DirectoryCatalog по умолчанию использует шаблон поиска *.dll.Поскольку у вас есть консольное приложение, которое использует расширение .exe, экспорт в этой сборке не будет обработан DirectoryCatalog - с шаблоном поиска по умолчанию.Скорее всего, вы захотите использовать AggregateCatalog, передавая DirectoryCatalog (*.dll), и либо другой DirectoryCatalog (*.exe), либо AssemblyCatalog входной сборки.
  3. В настоящее время у вас есть один [Import], в котором вы можете получить несколько [Export(typeof(IMessageSender))], вы не заявили, что переместили EmailSender в библиотеку классов, просто вы создали новый один, что означает, что вы, скорее всего, получите несоответствие количества элементов в том случае, когда ожидается двойной импорт, у вас много экспортов.Это явным образом вызовет исключение, что произойдет, даже если он не сможет найти ни одного экземпляра IMessageSender, потому что ваш атрибут [Import] не установлен для разрешения значения по умолчанию, где никакая часть не может быть предоставлена.Если вам нужно быть терпимым к ошибкам, вы можете использовать [Import(AllowDefault = true)]

Между прочим ... приведенный выше код не будет компилироваться, я предполагаю, что это был просто пример, а не копирование-вставка из вашеготекущий код?

public void SendMessage(string message)
{
    return message;
}

Вы перенастраиваете сообщение на метод void - это невозможно, и это также означает, что EmailSender неправильно реализует IMessageSender.Не слишком беспокоит, так как я думаю, что это пример больше, чем реальный код.

...