C# 在C语言的插件中访问主应用程序中的数据#

C# 在C语言的插件中访问主应用程序中的数据#,c#,plugins,system.reflection,C#,Plugins,System.reflection,我正在使用这种方法使我的C#应用程序可以为其他开发人员扩展: 它工作得很好,但只在“一个方向”上,这意味着编写新插件的开发人员可以在插件中定义方法和变量,这些方法和变量将导入到我的应用程序中 因此,我现在的问题是:我如何从插件中的主应用程序(例如变量“字符串测试”)访问现有数据?您需要为您的应用程序创建一个可供插件编写者使用的“SDK”。这应该包含任何您希望外部访问的接口 e、 g MyAppSdk.dll public interface IMyApplicationContext {

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

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

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

您需要为您的应用程序创建一个可供插件编写者使用的“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);
应用程序

public class MyPlugin : IPlugin {
     public void Do(IMyApplicationContext context) { 
         context.SomeService.DoAThing();
         System.Windows.MessageBox.Show(context.SomeData);
     }
}
context = GetApplicationContext();
plugin.Do(context);
您需要为您的应用程序创建一个可供插件编写者使用的“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);
应用程序

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

有几种方法

您可以创建一个
字典
,其中每个模块都有权设置或获取数据。你应该写一些逻辑来访问那本字典。例如,使用
T GetData(字符串键)
方法将位类型安全性引入其中

您可以在PRISM框架中使用事件系统,如
EventAggregator
,以实现模块之间的通信


但请注意,这将使您的模块相互依赖。这就是为什么您应该处理其他模块没有数据的情况。

有几种方法

您可以创建一个
字典
,其中每个模块都有权设置或获取数据。你应该写一些逻辑来访问那本字典。例如,使用
T GetData(字符串键)
方法将位类型安全性引入其中

您可以在PRISM框架中使用事件系统,如
EventAggregator
,以实现模块之间的通信


但请注意,这将使您的模块相互依赖。这就是为什么您应该处理其他模块没有数据的情况。

您能更详细地解释一下“应用程序”部分吗?我不知道如何访问插件中的信息。我已经用接口中的get/set变量尝试过了。然后我想在插件加载时设置应用程序中的信息,并在插件中获取它。。。但这不起作用。假设
imyaapplicationcontext
位于应用程序和插件共享的程序集中,您可以在应用程序中实现它并将其传递给插件。如何做到这一点取决于您,但我通常会建议使用DI。您能更详细地解释一下“应用程序”部分吗?我不知道如何访问插件中的信息。我已经用接口中的get/set变量尝试过了。然后我想在插件加载时设置应用程序中的信息,并在插件中获取它。。。但这不起作用。假设
imyaapplicationcontext
位于应用程序和插件共享的程序集中,您可以在应用程序中实现它并将其传递给插件。如何做到这一点取决于你自己,但我通常建议使用DI。我应该在哪里创建字典?在我的主应用程序中?但是我的插件如何访问它呢?你应该在你的主应用程序中创建它,并且你可以在你创建模块时让它在你的模块中可用:插入字典可用的类的实例(应该是一个单例实例)。我应该将主应用程序添加到插件的引用中吗?否则插件不知道我的主应用程序中的类,所以我不能插入它的实例。我不会这样做。将基类放在dll中,并在主应用程序和模块中引用此dll。那是更好的方法我应该在哪里创建字典?在我的主应用程序中?但是我的插件如何访问它呢?你应该在你的主应用程序中创建它,并且你可以在你创建模块时让它在你的模块中可用:插入字典可用的类的实例(应该是一个单例实例)。我应该将主应用程序添加到插件的引用中吗?否则插件不知道我的主应用程序中的类,所以我不能插入它的实例。我不会这样做。将基类放在dll中,并在主应用程序和模块中引用此dll。那是更好的办法