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