Я пишу приложение на основе плагина.C# Связь между плагином и хост-приложением
Хост приложения:
namespace CSK
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
LoadPlugins();
}
public void LoadPlugins()
{
DirectoryInfo di = new DirectoryInfo("./Plugins");
foreach (FileInfo fi in di.GetFiles("*_Plugin.dll"))
{
Assembly pluginAssembly = Assembly.LoadFrom(fi.FullName);
foreach (Type pluginType in pluginAssembly.GetExportedTypes())
{
if (pluginType.GetInterface(typeof(MainInterface.PluginHostInterface).Name) != null)
{
MainInterface.PluginHostInterface TypeLoadedFromPlugin = (MainInterface.PluginHostInterface)Activator.CreateInstance(pluginType);
MainInterface.IMother mother = new ApiMethods(this);
TypeLoadedFromPlugin.Initialize(mother);
}
}
}
}
}
Интерфейс:
namespace MainInterface
{
public interface PluginHostInterface
{
void Initialize(IMother mother);
}
public interface IMother
{
MenuItem addMenuItem(String header, String name);
MenuItem addSubMenuItem(MenuItem menu, String header, String name);
Boolean receiveMessage(String message, String from);
Boolean addContact(String name, String status, String proto, String avatar = "av");
}
}
Тест плагин:
namespace Plugin_Test
{
public class MainClass : MainInterface.PluginHostInterface
{
private MainInterface.IMother CSK;
public void Initialize(MainInterface.IMother mainAppHandler)
{
CSK = mainAppHandler;
}
}
}
А теперь я хочу, чтобы выполнить некоторые методы в Plugin Test из приложения хоста. Конечно, будет много плагинов, и не каждый из них будет содержать указанные методы. Я пытался использовать события, но безуспешно. Есть идеи, как это сделать?
'TypeLoadedFromPlugin.Initialize (mother);' <- you выполняют функцию плагина из приложения-хозяина прямо здесь. Какова ваша проблема? – x4rf41
Я хочу выполнять функции из плагина, например, щелчком мыши, а не по загрузке. И если я реализую новый метод в интерфейсе PluginHostInterface, я должен реализовать те же методы в каждом плагине. – jankes83
btw. используйте абстрактные классы вместо интерфейсов, если вы не хотите внедрять каждый метод, находящийся в интерфейсе. – x4rf41