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

前端之家收集整理的这篇文章主要介绍了基于插件的应用程序在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.

猜你在找的C#相关文章