C# · 12月 27, 2021

基于插件的应用程序在C#

我必须使用我选择的语言制作图形用户界面应用程序.应用程序将在 Windows XP上运行.它将是某种复杂的窗体应用程序.
我认为,根据大多数建议,C#将是最好的使用.
从配置文件读取后,GUI左侧的树结构将会被填充,这将是一个二进制文件. (但是最初我可以使用简单的ASCII文件来测试我的代码.)应用程序将通过该GUI接受用户的一些输入,并将回写到同一配置文件,并将反映树结构或标签或表单上任何其他相关字段的更改.

每个选项卡将有3个选项卡和3个对应​​的配置文件.
我现在需要一些帮助设计应用程序.我打算做主机应用程序(主应用程序),并使用3个选项卡控件作为插件.这可行吗如果可以,请指导我.我的意思是我如何在C#中编写3个插件,以及如何编写界面,以便主应用程序知道要加载哪个插件以及何时加载它?我的项目文件夹下会有一个单独的“插件”文件夹吗?我希望你有一点希望,尽管这个信息对你来说太少了.

此外,项目中已经存在一些.cpp文件.这些文件以及一些.h文件在其中包含一些重要的定义和常量.这些需要与我的C#应用​​程序集成.我不知道如何做到这一点,但我确信可以通过在.dll中编译.cpp代码,然后将编译的.dll公开到我的C#应用​​程序.如果您需要更多关于顶级设计的信息,请通知我.

谢谢,
Viren

解决方法 要手动实现插件界面,您将需要一种这样的方法.我已经留下了一些TODO,在那里你想要增强错误处理和/或使实现更具体化. public List<T> LoadPlugin<T>(string directory) { Type interfaceType = typeof(T); List<T> implementations = new List<T>(); //TODO: perform checks to ensure type is valid foreach (var file in System.IO.Directory.GetFiles(directory)) { //TODO: add proper file handling here and limit files to check //try/catch added in place of ensure files are not .dll try { foreach (var type in System.Reflection.Assembly.LoadFile(file).GetTypes()) { if (interfaceType.IsAssignableFrom(type) && interfaceType != type) { //found class that implements interface //TODO: perform additional checks to ensure any //requirements not specified in interface //ex: ensure type is a class,check for default constructor,etc T instance = (T)Activator.CreateInstance(type); implementations.Add(instance); } } } catch { } } return implementations; }

调用示例

List<IPlugin> plugins = LoadPlugin<IPlugin>(path);

对于你的问题的c部分.有几种不同的方法可以解决这个问题,但是正确的选择取决于你的具体情况.你可以在c中创建一个clr兼容的.dll,你的c#项目可以引用它,并且像其他引用的其他.dll一样调用.此外,您可以使用P/Invoke调用本机.dll.