博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.net使用外部程序集拓展功能
阅读量:4981 次
发布时间:2019-06-12

本文共 3250 字,大约阅读时间需要 10 分钟。

以windows窗体应用程序为例。

第一步,建立一个程序集,它包含能将插件插入可拓展windows窗体应用程序中的类型。

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace CommonSnappableTypes{    //为可插入拓展windows窗体应用程序的所有插件提供一个多态接口    public interface IAppFunction    {        void Doit();    }    //顺便提一个特性    [AttributeUsage(AttributeTargets.Class)]    public class CompanyInfoAttribute:System.Attribute    {        public string CompanyName{
get;set;} public string CompanyUrl{
get;set;} }}

2.构建插件

需要建立一个实现IAppFunction接口的类型

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;using CommonSnappableTypes;namespace CSharpSnapIn{    [CompanyInfo(CompanyName="My Company",CompanyUrl="www.MyCompany.com")]    public class CsharpModule : IAppFunction    {        public void Doit()        {           MessageBox.Show("Your have just used the C# snap in!");        }    }}

3.构建可拓展的Windows Froms应用程序

界面代码

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Reflection;using CommonSnappableTypes;namespace MyExtendApp{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();                   }        private void snapInModuleToolStripMenuItem_Click(object sender, EventArgs e)        {            OpenFileDialog dlg = new OpenFileDialog();            if (dlg.ShowDialog() == DialogResult.OK)            {                if (dlg.FileName.Contains("CommonSnapTypes"))                {                    MessageBox.Show("CommonSnapTypes has no snap-ins!");                }                else if(!LoadExternalModule(dlg.FileName))                {                     MessageBox.Show("Nothing implements IAppFunction!");                }            }        }        private bool LoadExternalModule(string path)        {            bool found = false;            Assembly asm = null;            try            {                asm = Assembly.LoadFrom(path);//加载程序集(插件)            }            catch(Exception ex)            {                MessageBox.Show(ex.Message);                return false;            }                    var theClassTypes = from t in asm.GetTypes()                                where t.IsClass && t.GetInterface("IAppFunction") != null                               select t;            foreach (var t in theClassTypes)            {                found = true;                IAppFunction iApp = asm.CreateInstance(t.FullName, true) as IAppFunction;                iApp.Doit();                listBox1.Items.Add(t.FullName);                DisplayCompanyData(t);            }            return found;        }        private void DisplayCompanyData(Type t)        {            var comInfos = from info in t.GetCustomAttributes(false)                          where info.GetType() == typeof(CompanyInfoAttribute)                          select info;            foreach (CompanyInfoAttribute info in comInfos)            {                MessageBox.Show(info.CompanyUrl, info.CompanyName);            }        }    }}

 

转载于:https://www.cnblogs.com/wxj111/archive/2013/05/24/3096684.html

你可能感兴趣的文章
用XPath查找HTML节点或元素
查看>>
Oracle统计、分析和优化环境配置
查看>>
指向函数的指针
查看>>
Ant步步为营(1)解压本地的zip包
查看>>
低版本的linux系统装samba服务器
查看>>
设计模式的
查看>>
关于MySql数据库设计表与查询耗时分析
查看>>
动画参数
查看>>
一道(古老的)英文题
查看>>
定义一些常亮
查看>>
怎么准确的判断当前页面是否有虚拟导航栏
查看>>
客户端(浏览器端)数据存储技术概览
查看>>
redis发布(pub)、订阅(sub)模式
查看>>
Python数据分析-知识宝藏
查看>>
安装libwxsmithlib-dev时提示“正试图覆盖...”的错误
查看>>
logback日志丢失的情况之一
查看>>
Style Transfer for Headshot Portraits
查看>>
[Windows Phone 7璀璨]北漂1.0在线歌词播放器一.项目搭建及版权声明
查看>>
ios 添加多个target 管理 多个版本文件
查看>>
二阶段之四
查看>>