C# 基于插件的C语言应用#

C# 基于插件的C语言应用#,c#,plugins,C#,Plugins,我必须使用我选择的语言制作一个图形用户界面应用程序。该应用程序将在Windows XP上运行。它将是某种复杂的windows窗体应用程序。 我认为,根据大多数建议,C#将是最好的选择。 GUI左侧的树结构将在读取二进制文件的配置文件后填充。(但最初我可以使用一个简单的ASCII文件来测试我的代码。)。应用程序将通过此GUI接受用户的一些输入,并将其写回同一配置文件,并将反映树结构或标签或表单上任何其他相关字段中的更改 每个选项卡将有3个选项卡和3个相应的配置文件。 我现在需要一些设计应用程序的帮

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

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

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

谢谢,
Viren是我使用过的最简单的插件概念之一,它肯定是.NET4(afaik)的一部分。不幸的是,它还没有完成,只有一个预览是可用的,这可能不同于最终版本。话虽如此,我们在一个uni项目中使用了MEF Preview 3,它工作起来没有问题,而且它确实使整个插件的工作变得更加容易。

看看。

.NET Framework在其内部使用COM模型。有关使用此技术的插件示例列表,请参阅。

查看系统。加载项命名空间:

否则你什么都可以自己做。在这个名称空间可用之前,我使用了每个插件/插件都需要使用的公共接口“IPlugin”。然后我有一个加载器,它检查文件夹中的所有*.dll,然后使用反射来检查接口。然后,我可以创建实现插件/插件接口的类的实例


cpp文件可能需要转换为c#,或者您可能需要创建一个要引用的dll。

要手动实现插件接口,您需要这样的方法。我在这里留下了一些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;
    }
公共列表加载插件(字符串目录)
{
类型接口类型=类型(T);
列表实现=新列表();
//TODO:执行检查以确保类型有效
foreach(System.IO.Directory.GetFiles(Directory)中的var文件)
{
//TODO:在此处添加正确的文件处理并限制要检查的文件
//添加try/catch以代替确保文件不是.dll
尝试
{
foreach(System.Reflection.Assembly.LoadFile(file.GetTypes())中的变量类型)
{
if(interfaceType.IsAssignableFrom(type)&&interfaceType!=type)
{ 
//找到了实现接口的类
//TODO:执行其他检查以确保
//接口中未规定的要求
//例如:确保类型是类,检查默认构造函数等
T instance=(T)Activator.CreateInstance(类型);
添加(实例);
}
}
}
捕获{}
}
返回实现;
}
要调用的示例:

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

至于你的问题的C++部分。虽然正确的选择取决于您的具体情况,但您可以通过几种不同的方式来实现这一点。您可以在C++中使用CLR兼容的DLL,您的C项目可以引用和调用任何其他的.DLL引用。此外,您可以使用调用本机.dll。

“我必须制作一个图形用户界面应用程序”鼓起勇气说“不”绝对可以使用MEF它太棒了。遇到一篇您不想看的文章总是很高兴,并且认为,我应该实现这样的功能,很棒的起点!