2015-02-11 2 views
1

Я пытаюсь реализовать инверсию управления (IoC) для разработки приложения на основе плагина, которое должно быть в состоянии передать данные (например, строки) обратно на мой основной EXE, когда что-то происходит. Для этого я передаю Action в DLL, которую он может использовать для отправки данных обратно в EXE. Следующий код показывает небольшое тестовое приложение, чтобы объяснить мои новичок проблемы:Как передать функцию другому классу с помощью IoC

namespace MainExe 
{ 
    class Program 
    { 
     [Import(typeof(IDataProvider))] 
     public IDataProvider stringProvider { get; set; } 

     public void myCallback(string str) 
     { 
      Console.WriteLine(str); 
     } 

     public Program() 
     { 
      try 
      { 
       AggregateCatalog aggregatecatalogue = new AggregateCatalog(); 
       aggregatecatalogue.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
       CompositionContainer container = new CompositionContainer(aggregatecatalogue); 
       container.ComposeParts(this);  
      } 
      catch (FileNotFoundException fnfex) 
      { 
       Console.WriteLine(fnfex.Message); 
      } 
      catch (CompositionException cex) 
      { 
       Console.WriteLine(cex.Message); 
      } 
     } 

     void Run() 
     { 
      if (stringProvider != null) 
      { 
       stringProvider.SaySomething("myrequest", myCallback); 
       Console.ReadKey(); 
      } 
     } 

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

Моего интерфейс выглядит следующим образом:

namespace DataInterfaceDll 
{ 
    public interface IDataProvider 
    { 
     void SaySomething(string request, Action<string> callback); 
    } 
} 

И это Plug-In (DLL), которые должны быть в состоянии послать что-то обратно в EXE (или вызвать функцию из EXE, которая делает это):

namespace StringDataDll 
{ 
    [Export(typeof(IDataProvider))] 
    public class StringData : IDataProvider 
    { 
     public void SaySomething(string request, Action<string> callback) 
     { 
      callback("This is just a test program..."); 
     } 
    } 
} 

Когда я запускаю этот код, я получаю System.Reflection.ReflectionTypeLoadException в следующей строке

container.ComposeParts(this); 

Может ли кто-нибудь сказать мне, что я делаю неправильно здесь?

+0

Есть ли копия dll StringDataDll в той же папке, что и исполняемый файл? –

ответ

1

Он работает для меня, динамически загружая DLL.

aggregatecatalogue.Catalogs.Add(new AssemblyCatalog(Assembly.LoadFile("yourpath\StringDataDll.dll"))); 
aggregatecatalogue.Catalogs.Add(new AssemblyCatalog(Assembly.GetAssembly(typeof(IDataProvider)))); 

И это тоже работает с new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory) при копировании stringDataDll.dll в папке вывода основной программы.

Обязательно наличие всех ваших файлов dll в выходной папке вашей основной программы.

Смежные вопросы