从C#中的插件中的主应用程序访问数据

时间:2017-07-17 11:26:53

标签: c# plugins system.reflection

我正在使用这种方法使我的C#应用​​程序可以为其他开发人员扩展:

Creating a simple plugin mechanism

它工作得很好,但仅限于“一个方向”,这意味着编写新插件的开发人员可以在插件中定义方法和变量,并将这些方法和变量导入到我的应用程序中。

所以现在我的问题是:如何在插件中访问我的主应用程序中已有的数据(例如变量“字符串测试”)?

2 个答案:

答案 0 :(得分:0)

您需要创建一个" SDK"适用于您的插件编写者可用的应用程序。这应包含您希望从外部访问的任何内容的接口。

e.g。

<强> MyAppSdk.dll

public interface IMyApplicationContext {
    string SomeData { get; set; }
    IMyAppService SomeService { get; set; }
}

public interface IPlugin {
    void Do(IMyApplicationContext context)
}

<强>插件

public class MyPlugin : IPlugin {
     public void Do(IMyApplicationContext context) { 
         context.SomeService.DoAThing();
         System.Windows.MessageBox.Show(context.SomeData);
     }
}

<强>应用

context = GetApplicationContext();
plugin.Do(context);

答案 1 :(得分:0)

有几种方法。

您可以创建Dictionary<string, object>,其中每个模块都有权设置或获取数据。您应该编写一些逻辑来访问该字典。例如,T GetData<T>(string key)方法可以为其带来一点安全性。

您可以在PRISM框架中使用EventAggregator之类的事件系统来启用模块之间的通信。

但请注意,这将使您的模块相互依赖。这就是你应该处理的原因,例如:如果没有其他模块的数据。