WinForm加载外部类库项目的集成开发模式
在项目开发中有一定的团队用到了Nuget、Coding;但是这用起来还是不太方方便,在Winform中呢,我们可以把一个人的项目当作一个类库项目,因为它生成的是一个dll文件,也就是单一文件,拥有了它,也就是拥有了项目。
类库项目简介
类库项目编译为.dll 程序集,在其他项目中添加对类库项目的引用,就可以访问它的内容(这可以是同一个解决方案的一部分,但这不是必须的)。这将扩展对象提供的封装性,因为类库可以进行修改和更新,而不会影响使用它们的其他项目。这意味着,您可以方便地升级类提供的服务(这会影响多个用户应用程序)。
所以,我们只要引用了它,也就可以在我们的主程序中进行使用项目小组成员的窗体了,那么我们还要手动去引用吗?类库下图,那太扯淡了!

如果你需要显示里面的窗体,你就可以这样,但是,我们要的是动态加载,那我们就不能通过这种方式了。
ClassLibrary1.Form1 from = new ClassLibrary1.Form1();
from.Show();
所以我们就可以通过反射它们,读取我们项目中的dll文件,这样就达到了目的,当然你可以做一个这样的管理界面,也就是窗体名称和dll文件路径的一个数据表,你就可以去读取数据库,去反射响应的dll了,这是非常有意思的事情,下面我就贴出代码,并一一讲解。
private ArrayList fromtypes = new ArrayList();
private ArrayList formObjects = new ArrayList();
private void Form1_Load(object sender, EventArgs e)
{
Assembly assembly = null;
string windowsPath = Path.Combine(Application.StartupPath, "ModulesDll");
foreach (string DllFile in Directory.GetFiles(windowsPath,"*.dll"))
{
assembly = Assembly.LoadFile(DllFile);
Type[] types = assembly.GetTypes();
foreach (Type typeObj in types)
{
if (typeObj.BaseType == typeof(Form))
{
this.fromtypes.Add(typeObj);
ToolStripItem item = this.menuStrip1.Items.Add(typeObj.FullName.ToString());
item.Click += new EventHandler(menuItemNewItem_Click);
}
}
}
}
首秀我们创建了集合来保存一些表单的类型和对象,在窗体加载的时候我们创建了反射类,然后我们还获取了dll的文件夹位置,就这样我们在其中进行了读取,获取了程序集的内容以及类型,然后再一一匹配,加入了我们的控件项中,然后给这个按钮添加了一个委托。
private void menuItemNewItem_Click(object sender, EventArgs e)
{
ToolStripMenuItem item = (ToolStripMenuItem)sender;
Type t = (Type)(this.fromtypes[Convert.ToInt32(item.Tag)]);
Object obj = Activator.CreateInstance(t);
this.formObjects.Add(obj);
t.InvokeMember("Text", BindingFlags.SetProperty, null, obj, new object[] { t.FullName + " 窗体"});
t.InvokeMember("Show", BindingFlags.InvokeMethod, null, obj, new object[] { });
ToolStripMenuItem tsmi = new ToolStripMenuItem();
tsmi.Click += new EventHandler(menuItemWindow_Click);
}
在委托中获取了源对象,也就是本身,然后通过把这个本身转换成了控件需要的项,获取了其中深度是为了匹配它的类型,我们还通过了Activator类创建了Form的实例,在集合中添加了该对象,再之后,通过了InvokeMember给这个对象的属性添加了一些值,最后我们再给这个对象添加一个Click,如以下定义
private void menuItemWindow_Click(object sender, EventArgs e)
{
MenuItem item = (MenuItem)sender;
((Form)(this.formObjects[item.Index - ])).Activate();
}
通过 Activate 方法来激活窗体,如果你是mdi窗体,你需要 InvokeMember 进入父窗体,如以下定义
t.InvokeMember("MdiParent", BindingFlags.SetProperty, null, obj, new object[] { this });
你可以创建一个表来存储这些相关数据,我这里也不多说那些字段了,自己体会吧,大概就是以下定义
create table ProjectModules
(
id int , DllPath nvarchar, FromName varchar, isDisplay bit
)
WinForm加载外部类库项目的集成开发模式的更多相关文章
- 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件
[源码下载] 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件 作者 ...
- 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件
CustomResource ResourceDictionary 加载外部的 ResourceDictionary 文件 示例1.演示“CustomResource”相关知识点Resource/Cu ...
- Vue 加载外部js文件
Vue.js 加载外部js文件 在项目内新建一个config.js //变量的定义 export var config = { baseurl:'http://172.16.114.5:8088/M ...
- iframe 加载外部资源,显示隐藏loading,onload失效
在项目中使用iframe 来加载外部资源,需要在iframe请求外部资源的时候,需要显示一个loading,在加载完成后,将这个loading隐藏掉,刚开始看到W3C中 iframe有一个 onloa ...
- UNITY_资源路径与加载外部文件
UNITY_资源路径与加载外部文件 https://www.tuicool.com/articles/qMNnmm6https://blog.csdn.net/appppppen/article/de ...
- Silverlight实用窍门系列:2.Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)【附带实例源码】
接上节所讲的,Silverlight可以加载外部的XML文件里面的内容,那么我们可不可以在外部XML里面配置一个WebService地址,并且以此加载这个地址来动态加载WebService呢?这样子就 ...
- 【转】C# winform 加载网页 模拟键盘输入自动接入访问网络
[转]C# winform 加载网页 模拟键盘输入自动接入访问网络 声明: 本文原创,首发于博客园 http://www.cnblogs.com/EasyInvoice/p/6070563.html ...
- Windows Phone 8加载外部动态链接库DLL(非安装包内的)
Windows Phone 8加载外部动态链接库DLL(非安装包内的) 在<动态加载与插件化>中大概介绍了下,wp8加载非安装包的下动态链接库,这次详细梳理下. 加载外部DLL主要的原理: ...
- Android 插件化开发(二):加载外部Dex文件
在学习Java反射的技术后,我们可以开始更深一步的探究插件化开发了.首先先讲一下Android App的打包流程,然后我们通过一个简单的例子 —— 实现插件化加载外部Dex来完成初级的插件化开发的探索 ...
随机推荐
- 学习Layui 第一天
Layui 官网说这是款经典模块化前端框架 个人觉得Layui很好用,容易上手. 在学习Layui的之前.先去官网下载必要的文件 将这些文件放入项目当中 然后可以到官网看一下示例. 可以做一个简单的表 ...
- juniper srx 配置
天涯海角- juniper为人所熟悉的一定是从netscreen开始的,作为一线防火墙品牌,还是有很高的地位.但是以前玩netscreen,都是用的网页版去配置,而且网页版做得很不错.但是现在nets ...
- Unity3D学习(七):Unity多重采样抗锯齿设置无效的解决办法
前言 学习Shader的过程中发现模型锯齿严重,于是去Edit--Project Settings--Quality选项下将反锯齿设置为了8X Multi Sampling.结果没有任何改变,如图: ...
- Vlan ---虚拟局域网
VLAN是一种将局域网(LAN)设备从逻辑上划分(注意,不是从物理上划分)成一个个网段(或者说是更小的局域网LAN),从而实现虚拟工作组(单元)的数据交换技术.VLAN(Virtual Local A ...
- Tiny4412之蜂鸣器驱动与led灯驱动
一:LED驱动编写 要编写LED驱动,首先的知道开发板的构造:开发板分为核心板与底板:编写驱动的第一步就是要看开发板,找到LED灯在开发板上的位置及所对应的名字:第一步就要查看核心板电路图,以及底板电 ...
- python字符串操作实方法大合集
python字符串操作实方法大合集,包括了几乎所有常用的python字符串操作,如字符串的替换.删除.截取.复制.连接.比较.查找.分割等,需要的朋友可以参考下: #1.去空格及特殊符号 s.st ...
- 在基于Windows系统的PHP虚拟主机上实现域名的301永久重定向
作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=581 操作背景: 当网站在更换或添加域名.进行网址规范化或删除旧页面时,出于对用户使用体验和搜索引擎优化方面的考虑就需要 ...
- 居中 html css
<div id="main" style="width:800px;height: 600px;margin:0 auto"> <!-- 这里 ...
- Dubbo源码-Dubbo是如何随心所欲自定义XML标签的
叨叨 今天考虑了很久要不要写这篇文章. 距离<Dubbo源码>系列的开篇到现在已经快两个月时间了.当时是想着工作上的RPC框架使用存在一些让人头疼的问题,就来看看Dubbo给出了一套什么样 ...
- c# xml操作(一)
c# xml操作(一) 此博文包含图片 (-- ::)转载▼ 标签: 杂谈 分类: c# 同样是增,删,改,查四种操作.现在我们就详细介绍一下增和删两种操作.看下面的一个xml示例: <?xml ...