C#实现插件式开发的一个Demo分享

这篇博客分享了一个C#实现的Winform插件式开发Demo,通过定义插件接口,创建DLL项目,并在主程序中使用反射加载插件。博主提供了项目结构和运行效果截图,可供感兴趣的开发者参考和下载源码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


winform程序,很多时候都需要用到插件式的,所以本人做了一个Demo,思路跟网上思路基本一致,现在共享出来如有需要的朋友可以下载。

原理很简单:

一:定义插件接口

二:实现插件接口并建立不同工项目,使其在生成时生成不同的DLL

三:主程序运行时根据接口名利用反射对插件目录的DLL进行加载,加载完成后便可以使用插件接口定义的方法或属性了。

下面上几张图,有兴趣的朋友可以先看看,觉得值得一看的朋友可以下载。

项目结构:

DefaultPlugin,PosPlugin两个项目均为插件,均实现了Iplugin接可

Iplugin接口
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  System.Drawing;
using  System.Windows.Forms;

namespace  WinDemo.Core
{
    
public   interface  Iplugin
    {

        PluginInfoAttribute PluginInfo
        { 
get set ; }
        
bool  IsLoad
        {
            
get ;
            
set ;
        }

        Image ModulePicture
        {
            
get ;
        }

        Image ModulePictureEnter
        {
            
get ;
        }

        Image ModulePictureClick
        {
            
get ;
        }

        
string  ModuleName
        {
            
get ;
        }


        Dictionary
< string , EventHandler >  ChildNodes
        {
            
get ;
        }

        ILoadForm FormLoader
        {
            
get ;
            
set ;
        }

       
    }
}

 

用于加载插件的类 PluginLoader
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  System.Reflection;
using  System.IO;
using  System.Windows.Forms;
using  System.Collections;

namespace  WinDemo.Core
{
    
public   static   class  PluginLoader
    {

        
public   static  List < Iplugin >  plugins  =   new  List < Iplugin > ();
        
private   static  ArrayList piProperties  =   new  ArrayList();
        
        
private   static   bool  IsValidPlugin(Type t)
        {
            
bool  ret  =   false ;
            Type[] interfaces 
=  t.GetInterfaces();
            
foreach ( Type theInterface  in  interfaces ) {
                
if  (theInterface.FullName  ==   " WinDemo.Core.Iplugin " )
                {
                    ret 
=   true ;
                    
break ;
                }
            }
            
return  ret;
        }


       

        
public   static   void  LoadAllPlugins()
        {
            
string [] files  =  Directory.GetFiles(Application.StartupPath  +   " //plugin// " );
            
int  i  =   0 ;
            PluginInfoAttribute typeAttribute 
=   new  PluginInfoAttribute();
            
foreach  ( string  file  in  files)
            {
                
string  ext  =  file.Substring(file.LastIndexOf( " . " ));
                
if  (ext  !=   " .dll " continue ;
                
try
                {
                    Assembly tmp 
=  Assembly.LoadFile(file);
                    Type[] types 
=  tmp.GetTypes();
                    
bool  ok  =   false ;
                    
foreach  (Type t  in  types)
                        
if  (IsValidPlugin(t))
                        {
                            Iplugin plugin 
=  (Iplugin)tmp.CreateInstance(t.FullName);
                            plugins.Add(plugin);
                            
object [] attbs  =  t.GetCustomAttributes(typeAttribute.GetType(),  false );
                            PluginInfoAttribute attribute 
=   null ;
                            
foreach  ( object  attb  in  attbs)
                            {
                                
if  (attb  is  PluginInfoAttribute)
                                {
                                    attribute 
=  (PluginInfoAttribute)attb;
                                    attribute.Index 
=  i;
                                    i
++ ;
                                    ok 
=   true ;
                                    
break ;
                                }
                            }

                            
if  (attribute  !=   null )
                            {
                                piProperties.Add(attribute);
                                plugin.PluginInfo 
=  attribute;
                            }
                            
else   throw   new  Exception( " 为定义插件属性 " );
                            
if  (ok)  break ;
                        }
                }
                
catch  (Exception err)
                {
                    
throw  err;
                }
            }
            plugins.Sort((p1, p2) 
=>  {
                
return  p2.PluginInfo.Index  -  p1.PluginInfo.Index;
            });
        }
    }
}

 

Iplugin的实现类PosPlugin类
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  System.Drawing;
using  WinDemo.Core;
using  System.Windows.Forms;
 

namespace  DefaultPlugin
{
    [PluginInfo(
" Default " , " 1.0 " , " XH " , " www.cnporter.com " , true , 2 )]
    
public   class  Default : WinDemo.Core.Iplugin
    {
        
private  Dictionary < string , EventHandler >  _ChildNodes  =   new  Dictionary < string , EventHandler > ();
        
private  LeftNav frmLeftNav  =   new  LeftNav(); 
        
public   static  ILoadForm Formloader ;
        
public  Default()
        {

            _ChildNodes.Add(
" 菜单五 " , (sender,e)  =>
            {
                MessageBox.Show(sender.ToString());
            });
            _ChildNodes.Add(
" 菜单四 " , (sender, e)  =>
            {
                MessageBox.Show(sender.ToString());
            });
            _ChildNodes.Add(
" 菜单三 " , (sender, e)  =>
            {
                MessageBox.Show(sender.ToString());
            });
            _ChildNodes.Add(
" 菜单二 " , (sender, e)  =>
            {
                MessageBox.Show(sender.ToString());
            });
            _ChildNodes.Add(
" 菜单一 " , (sender, e)  =>
            {
                FormLoader.LoadNavFrm(frmLeftNav);
            });
        }

        

        
public  Image ModulePicture
        {
            
get
            {
                
return  ((System.Drawing.Image)(ImageResource.Index));
            }
        }

        
public  Image ModulePictureEnter
        {
            
get
            {
                
return  ((System.Drawing.Image)(ImageResource.IndexEnter));
            }
        }

        
public  Image ModulePictureClick
        {
            
get
            {
                
return  ((System.Drawing.Image)(ImageResource.IndexClick));
            }
        }

        
public   string  ModuleName
        {
            
get
            {
                
return   " 首页 " ;
            }
        }

        
public  Dictionary < string , EventHandler >  ChildNodes
        {
            
get
            {
                
return  _ChildNodes;
            }
        }




        
public   bool  IsLoad
        {
            
get ;
            
set ;
        }
        
        
public  ILoadForm FormLoader
        {
            
get
            {
                
return  Formloader;
            }
            
set
            {
                Formloader 
=  value;
            }
        }



        
public  PluginInfoAttribute PluginInfo
        {
            
get ;
            
set ;
        }
    }

 
}
 

此图现在有两个插件

 

运行效果如下

 

源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值