精华内容
下载资源
问答
  • Winform 插件开发

    2015-07-10 09:19:48
    利用MEF实现Winform窗体的插件开发 1 通过AppConfig文件,获取指定或所有DLL文件 2 定义了一个From接口 IFrom . 所有窗体都继承自此接口 3 DAL层DLL 放在了与插件项目一起的Plugs目录下(此处感觉有些不妥,待想出...
  • 插件式开发 C#插件式开发 winform插件式 简单实用的实例,有详细博客介绍 低资源分分享,希望能帮助到后来者
  • 插件式开发的好处很多,这里只说说借助ICSharpCode来实现插件式开发的过程。 首先下载ICSharpCode.Core.dll和ICSharpCode.Core.WinForms.dll,然后配置一个Addin文件,取名为SubMenu.Addin,内容如下: 1<...

    插件式开发的好处很多,这里只说说借助ICSharpCode来实现插件式开发的过程。

    首先下载ICSharpCode.Core.dll和ICSharpCode.Core.WinForms.dll,然后配置一个Addin文件,取名为SubMenu.Addin,内容如下:

     

     1<AddIn name        = "ShtxSmsSum"
     2       author      = "JasonChou"
     3       url         = "http://www.xxxx.cn"
     4       description = "外部插件">
     5
     6    <Manifest>
     7
     8    </Manifest>
     9
    10    <!--Runtime节指定了插件功能模块所在的库文件MainForm.dll的具体路径-->
    11    <Runtime>
    12      <Import assembly="ShtxSmsSum.PlugIn.dll"/>
    13    </Runtime>
    14
    15    <!--Path节中指定了扩展点路径/JasonChou/myMenus(该路径是指在程序运行时自动运行该插件),然后在Path内指定了它的ID、Command类名-->
    16    <Path name = "/JasonChou/myMenus">
    17      <MenuItem id = "External_Menu"
    18                    type = "Menu"
    19                    label = "其它工具"
    20                insertbefore = "Manager">
    21        <MenuItem id ="SmsAccountTool"
    22                  label="短信统计工具"
    23                  class="ShtxSmsSum.PlugIn.SmsAccountTool"
    24                  />
    25        <MenuItem id ="SearchHistoryCommand"
    26                  label="历史价格查询"
    27                  class="ShtxSmsSum.PlugIn.SearchHistoryCommand"
    28                  />
    29        <MenuItem id ="SearchSendSumCommand"
    30                  label="查询发送数量"
    31                  class="ShtxSmsSum.PlugIn.SearchSendSumCommand"
    32                  />
    33    </MenuItem>
    34  </Path>
    35
    36    
    37</AddIn>
    38

     

    如果以上代码有不明白的,先不管它,继续看下面之后会明白的,在主程序的Program.cs文件main方法中加入如下代码:

     

     1Assembly asm = Assembly.GetExecutingAssembly();
     2FileUtility.ApplicationRootPath = Path.GetDirectoryName(asm.Location);
     3CoreStartup coreStartup = new CoreStartup("ShtxSmsSum");
     4coreStartup.PropertiesName = "ShtxSmsSum";
     5coreStartup.StartCoreServices();
     6// 在指定文件夹中搜寻插件的配置文件
     7coreStartup.AddAddInsFromDirectory(Path.Combine(FileUtility.ApplicationRootPath, "PlusIn"));
     8// AddinManager 插件的属性:保存用户禁用的插件信息
     9coreStartup.ConfigureExternalAddIns(Path.Combine(PropertyService.ConfigDirectory, "AddIns.xml"));
    10// AddinManager 插件的属性:保存用户安装的插件信息
    11coreStartup.ConfigureUserAddIns(Path.Combine(PropertyService.ConfigDirectory, "AddIns"),
    12Path.Combine(PropertyService.ConfigDirectory, "AddIns"));
    13coreStartup.RunInitialization();

    这段的作用是在程序开始运行时就加载Addin文件里面的内容。然后在主窗体的构造方法中加入下面一句:

    MenuService.AddItemsToMenu(menuStrip1.Items, this, "/JasonChou/myMenus");

    这样就把Addin里面配置的菜单加入了主窗体的menuStrip1这个菜单控件中。

    下面就是开发插件了,新建一个类库项目,这里取名叫ShtxSmsSum.PlugIn,下面有三个窗体Form1、SearchHistory、SearchSendSum,把相应功能做好,进入最后一步:

    在此ShtxSmsSum.PlugIn项目中新建一个类,我取名叫CommandMenu.cs,里面代码如下:

     

     1namespace ShtxSmsSum.PlugIn
     2ExpandedBlockStart.gifContractedBlock.gif{
     3    public class SmsAccountTool : AbstractMenuCommand
     4ExpandedSubBlockStart.gifContractedSubBlock.gif    {
     5        public override void Run()
     6ExpandedSubBlockStart.gifContractedSubBlock.gif        {
     7            Form1 st = new Form1();
     8            st.Show();
     9        }

    10    }

    11
    12    public class SearchHistoryCommand : AbstractMenuCommand
    13ExpandedSubBlockStart.gifContractedSubBlock.gif    {
    14        public override void Run()
    15ExpandedSubBlockStart.gifContractedSubBlock.gif        {
    16            SearchHistory sh = SearchHistory.GetInstance();
    17            sh.Show();
    18        }

    19    }

    20
    21    public class SearchSendSumCommand : AbstractMenuCommand
    22ExpandedSubBlockStart.gifContractedSubBlock.gif    {
    23        public override void Run()
    24ExpandedSubBlockStart.gifContractedSubBlock.gif        {
    25            SearchSendSum ss = SearchSendSum.GetInstance();
    26            ss.Show();
    27        }

    28    }

    29}

     

    继承ICSharpCode.Core中的AbstractMenuCommand类,然后重写Run方法,在Run方法中把新窗体显示出来即可。这样就完成了一个很简单的插件式开发,运行结果如下:

    转载于:https://www.cnblogs.com/JasonChou/archive/2009/05/14/1457095.html

    展开全文
  • 支持程序运行实时更新插件的框架
  • 热拔插Winform插件式框架设计demo

    千次阅读 2017-09-30 16:29:44
    http://www.51aspx.com/Code/HotPlugWinformPlug 思路蛮好的,可以借鉴下

    http://www.51aspx.com/Code/HotPlugWinformPlug

    思路蛮好的,可以借鉴下


    展开全文
  • C# winform插件式编程之我思

    千次阅读 2011-09-22 11:31:05
    在客户管理中客户基本档案管理、客户分类管理可以看做程序固定不变的部分也是程序初期必须实现的功能,作为主程序部分优先开发,客户简历,客户兴趣爱好,客户调查这些相对变化比较大,可以作为后期扩展开发

    1、主程序:

    核心程序,把变动不大项目必须的部分写入主程序。

    以客户管理为例:

    在客户管理中客户基本档案管理、客户分类管理可以看做程序固定不变的部分也是程序初期必须实现的功能,作为主程序部分优先开发,客户简历,客户兴趣爱好,客户调查这些相对变化比较大,可以作为后期扩展开发,写成插件。

    我们在这里只说插件开发实现部分,其它的不在详述。

    新建一个解决方案:插件式开发客户管理

    在解决方案里新建windows应用程序项目:CRM

    到这里先放下,进入插件实现部分。

     

    2、接口定义:

    在解决方案里新建一个类库项目:CRM.IPlugin

    在项目里新建一个类:IVote.cs

    代码:

    using System;
    
    namespace CRM.IPlugin
    {
        public interface IVote
        {
            void Setup();
            string GetPluginName();
        }
    }


     

    3:、插件编写:

    在解决方案里新建一个类库项目:CRM.Plugins

    添加引用:

    .NET:  System.Windows.Forms

    项目:  CRM.IPlugin

    在项目里新建一个窗体:Vote.cs

    窗体代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace CRM.Plugins
    {
        public partial class Vote : Form,CRM.IPlugin.IVote
        {
            public Vote()
            {
                InitializeComponent();
            }
    
            private void Vote_Load(object sender, EventArgs e)
            {
                this.Text = "客户投票调查";
            }
    
            #region IVote 成员
    
            public void Setup()
            {
                this.Show();
            }
    
            public string GetPluginName()
            {
                return "客户投票调查";
            }
    
            #endregion
        }
    }
    


     到此,插件算是编写完成。下面找到CRM项目文件夹在bin\debug目录下新建目录Plugins,回到vs解决方案资源管理器中选择CRM.Plugins项目,右键-》属性-》生成-》输出目录设置为..\CRM\bin\Debug\Plugins\,最后再生成一下CRM.Plugins项目。

     

    4、调用插件:

    回到项目CRM,打开窗体在窗体上拖放一个ListBox控件,切换到代码视图输入如下的代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace CRM
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                this.LoadPlugins();
            }
    
            //存储插件DLL文件的路径
            private System.Collections.ArrayList PluginsDLL = new System.Collections.ArrayList();
            /// <summary>
            /// 加载所有插件
            /// </summary>
            private void LoadPlugins()
            {
                try
                {
                    //获取Plugins目录文件
                    string[] PluginFiles = System.IO.Directory.GetFiles(Application.StartupPath + @"\Plugins");
                    foreach (string PluginFile in PluginFiles)
                    {
                        //dll文件才是有效的插件程序集
                        if (PluginFile.ToUpper().EndsWith(".DLL"))
                        {
                            //通过反射加载dll程序集
                            System.Reflection.Assembly Ab = System.Reflection.Assembly.LoadFrom(PluginFile);
                            //获取加载的dll程序集里面的类名称
                            Type[] Types = Ab.GetTypes();
                            foreach (Type T in Types)
                            {
                                //检查类是否实现了定义的IVote接口
                                if (T.GetInterface("IVote") != null)
                                {
                                    listBox1.Items.Add(T.FullName);
                                    PluginsDLL.Add(PluginFile);
                                }
                            }
                        }
    
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            /// <summary>
            /// 调用插件方法
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void listBox1_Click(object sender, EventArgs e)
            {
                try
                {
                    if (listBox1.SelectedIndex == -1)
                    {
                        return;
                    }
                    string PluginDLLFile = PluginsDLL[listBox1.SelectedIndex].ToString();
                    //加载插件DLL程序集
                    System.Reflection.Assembly Ab = System.Reflection.Assembly.LoadFrom(PluginDLLFile);
                    //创建插件中名称为listBox1中选中项名称的类的实例
                    object Plugin = Ab.CreateInstance(listBox1.SelectedItem.ToString());
                    Type T = Plugin.GetType();
    
                    //获取类中的方法GetPluginName
                    System.Reflection.MethodInfo PluginMethodReturnValue = T.GetMethod("GetPluginName");
                    //执行有返回值的方法
                    object returnValue = PluginMethodReturnValue.Invoke(Plugin, null);
                    MessageBox.Show("您调用的插件是:"+returnValue.ToString());
    
                    //获取类中的方法Setup
                    System.Reflection.MethodInfo PluginMethod = T.GetMethod("Setup");
                    //执行无返回值的方法
                    PluginMethod.Invoke(Plugin, null);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
    }


     

     5、总结:

    插件式编程是牺牲了程序的一部分执行效率来换得开发效率,我也只是初步理解。

    对于这个示例程序来说,我觉得最大的缺陷有以下几点:

    1、调用插件方法的时候每次都要加载插件DLL文件和创建相应的实例,这里还有很大的性能改进空间,应该可以用缓存来存储创建的实例,但是由于对winform下的缓存我还没有掌握,暂时没有解决。

    2、每次调用都会打开一个窗口,我想到一个解决办法就是在插件窗体调用方法Setup里检测窗体是否在applicaton.openForm里面,在的话就把创建的对象释放掉,不在则显示,觉得不是那么好,希望大家给出更好的办法。

    代码如下,修改CRM.Plugins里面的vote窗体的Setup方法:

    public void Setup()
            {
                System.Windows.Forms.FormCollection FormColl = Application.OpenForms;
                if (FormColl[this.Name] != null)
                {
                    (FormColl[this.Name] as Form).WindowState = FormWindowState.Normal;
                    (FormColl[this.Name] as Form).Focus();
                    this.Dispose();
                }
                else
                {
                    this.Show();
                }
            }


     

     

     

    展开全文
  • Winform混合式开发框架的特点总结 Winform混合式开发框架,是一种支持分布式部署的应用模式,支持直接连接数据库,访问远程WCF服务,访问远程Web API服务等服务的综合性框架,根据不同的需求采用不同的数据接口...

    Winform混合式开发框架的特点总结

    Winform混合式开发框架,是一种支持分布式部署的应用模式,支持直接连接数据库,访问远程WCF服务,访问远程Web API服务等服务的综合性框架,根据不同的需求采用不同的数据接口,是一个适应性很广的应用框架。  混合式开发框架它本身是一个完整的业务系统外,它外围的所有辅助性模块(如通用权限、通用字典、通用附件管理、通用人员管理、通讯录管理......)均都实现了这种混合型的框架,因此使用非常方便。

    1、多种数据接入方式

    《混合式开发框架》混合了传统《Winform开发框架》、《WCF开发框架》和Web API接口框架的特点,可以在直接访问数据库、利用WCF服务获取数据、利用Web API服务获取数据三者之间自由切换,统一了系统界面层对业务服务的调用模式,所有组件模块均实现三种方式的调用,是一种弹性化非常好的框架应用,既可用于单机版软件或者基于局域网内的应用软件,也可以用于分布式技术的互联网环境应用,是一种成熟稳定、安全高效的技术框架。

    由于混合型框架,既可以用于传统Winform系统开发,也可以用于WCF分布式系统开发,还可以用于轻型高效的Web API的分布式系统开发,因此环境适应性强;而且由于模块具有这些特点,可重用性更高,特别对于通用性的模块,更是具有无可替代的优越性。

     

    2、独立配置,更少的代码修改

    混合框架所有通用模块,如果是通过WCF或者Web API服务接入的,那么客户端模块都需要配置好对应的访问地址。

    WCF服务连接,通过独立配置文件进行配置WCF的连接,减少主配置文件的复杂性;

    Web API每个服务的连接地址也是可以通过配置文件进行指定,根据需要采用HTTP或者HTTPS协议进行数据传输。

    这些接入的配置,都是独立放在在不同的文件里面,这样可以方便集中修改,也方便通过程序界面进行配置调整。如在混合框架里面,提供了一个管理界面,用来管理这些接口的切换和配置参数的。

    其中相关的接口地址参数,可以在管理界面里面统一进行维护修改。

     

    3、提供多种主体界面布局方式

    混合框架提供多种模块调用方式,可以通过预先配置好的菜单,以插件方式动态构建对应的菜单按钮,并触发调用对应的插件模块进行展示;也可以按常规的添加菜单按钮方式进行功能按钮布局。

    混合框架主体界面同时也提供多种界面布局方式,可以按标准的顶栏菜单模式展示,如下所示。

    也可以在左边放置类似OutLookBar的功能条,在放置对应的菜单功能树,这样可以展示更多的功能模块,适用于系统功能较为复杂的情况使用。

     

    4、代码生成工具的集成

    整个框架的应用开发,代码生成工具Database2Sharp是灵魂,它围绕着不同的框架,根据设计好的数据库信息,生成主体框架信息,把不同类型的类文件放在不同的项目中,实现快速的框架增量开发;另外整个框架的Winform界面和Web界面,都可以快速生成,稍微调整下即可实现专业性界面的设计开发工作,并能够迅速编译运行起来,从而实现快速、高效、统一的框架应用开发。

    1)主体框架代码的生成

    EnterpriseLibrary代码生成时一个整体性项目代码的生成操作,它能根据设计好数据库信息以及模板文件,生成一个完整性非常高的项目。一般结合我们的Winform开发框架WCF开发框架、混合型开发框架或者Web开发框架,进行增量式的项目开发,效率更高,而且可以可以利用更多已经开发好的、现成的组件模块的集成,完美的整合,以及模块化的封装,能带给你无穷的开发乐趣同时,使得项目无论从代码风格、用户界面、设计理念,都能保持很好的统一,快速优雅的完成碰到的项目。

    代码生成工具,生成整体性的混合型框架项目如下所示,只是没有下图的界面部分,这部分在实际开发过程中,结合我的混合型框架案例进行整合即可,另外也可以界使用Database2Sharp进行Winform界面的开发,这样整体性就非常方便操作了:

     

    2)界面代码的生成

    界面开发,无论对于Web开发,还是Winform开发,都需要耗费一定的时间,特别对于一个数据库字段比较多的界面,一般就需要在编辑界面上摆的更多的控件来做数据显示,每次碰到这个,都有点头痛,反复的机械操作让人挺累,也很烦,但是又必须这样做。

    由于数据库字段和界面的排版都有一定的关联关系,因此可以通过代码生成工具Database2Sharp的数据库元数据,包含表名称、备注信息、字段列表,以及每个字段的名称、备注、类型等信息,构造一个基础的界面,把重复机械的部分给快速完成,这就是我所说的界面快速生成。当然,对于精致的界面,机械的生成肯定不能满足我们的需要,因此真正的界面需要在这个基础上修改完善一下,但是由于重复劳动部分,已经给工具处理掉了,因此,界面开发效率会大大提高。

    Winform界面可以生成标准的列表展示界面,也可以生成主从表界面,基本上适应了大多数的情况。

    转载于:https://www.cnblogs.com/zxtceq/p/5417527.html

    展开全文
  • 那么就会有这样的一个过程,使用插件时,触发了插件的事件,插件的事件,能够使用所在窗体的函数,还往其中传递信息。这样插件也可以反过来控制窗体。 核心代码如下: //创建返回数据的事件: public ...
  • WinForm开发插件DevExpress安装及使用

    千次阅读 2018-06-11 21:13:11
    WinForm开发插件DevExpress安装及使用 在Visual Studio中安装DevExpress开发插件 插件的使用方法 简单的Demo介绍 下载链接:https://pan.baidu.com/s/1smeXRWkUpb–VA0XjsM4tQ -首先给大家介绍一下...
  • 1.如果我们在实际的开发过程中, 没有把一些功能模块区分开来的话, 那么带来的麻烦, 势必是要修改源代码。 2.直到有一天,B客户又说需要某些功能,这个时候, 我们又要修改一次源代码, 更新给客户 , 所以想了想, 如果每...
  • AutoFac 插件式开发示例
  • C#插件式框架开发完整DemoC#插件式框架开发完整DemoC#插件式框架开发完整DemoC#插件式框架开发完整DemoC#插件式框架开发完整DemoC#插件式框架开发完整Demo
  • .net 插件式开发学习总结

    千次阅读 2016-03-19 17:09:19
    .NET简谈插件系统开发模式 今天跟大家分享一下我们在日常开发中并不常用的开发模式“插件系统模式”,什么叫插件从大一点的概念讲就是我们开发的软件是由很小的模块组成,每一块都能成功的装卸,使我们的软件成为...
  • 一个C# 插件式开发完整演示Demo(绝对原创,含源代码),结构清晰明了,一看就会,不可多得。
  • Winform开发框架之插件化应用框架实现 https://www.cnblogs.com/wuhuacong/p/3180589.html
  • C# 插件式开发

    2017-08-19 12:48:00
    在网上找了下插件式编程的资料,这里自己先借鉴下别人的,同时发现有自己的看法,不过由于本人水平有限,不一定有参考价值,写出来一方面是为了总结自己,以求提高,另一方面也希望各为朋友看到我的不足,给我提出...
  • SailingEase WinForm Framework WinForm开发框架开发手册:http://docs.shengxunwei.com/Home/Browser/sewinformfw/      对于一些较小的项目,具备一定经验的开发人员应该能够设计和构建出便于进行维护和...
  • SailingEase WinForm 应用程序开发框架是针对微软 .NET 平台下 Windows 应用程序的开发所精心设计实现的源代码级开发平台。由原江苏电信10000号开发团队技术经理主导开发WinForm开发框架。本框架来源于实际项目...
  • 也来学学插件式开发

    2013-02-21 09:27:42
    一家公司有用到插件式开发来做一个工具箱,类似于QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了。可惜在那家公司待的时候有点短,没有好好研究一下。现在有空,自己在网上找了些资料,也来试试。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,749
精华内容 699
关键字:

winform插件式开发