在设计模式的策略模式中,需要动态加载程序集信息,本文通过一个简单的实例,来讲解动态加载Dll需要的知识点。

涉及知识点:
如下图所示:
具体代码如下:
public partial class DllLoadForm : Form
{
public DllLoadForm()
{
InitializeComponent();
}
private void btnOpenFile_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog()
{
Multiselect=false,
Filter = "Dll Info|*.dll|All Files|*.*",
InitialDirectory=AppDomain.CurrentDomain.BaseDirectory,
Title="Dll信息",
Tag="请选择"
};
if (ofd.ShowDialog() == DialogResult.OK) {
this.txtDllFile.Text = ofd.FileName;
}
}
private void btnLoadDll_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(this.txtDllFile.Text.Trim())) {
MessageBox.Show("请选择dll文件");
return;
}
LoadDllInfo(this.txtDllFile.Text);
}
/// <summary>
/// 动态加载Dll
/// </summary>
/// <param name="dllPath">需要加载的Dll的路径</param>
public void LoadDllInfo(string dllPath)
{
if (File.Exists(dllPath))
{
TreeNodeCollection tvNodes = tvDllInfo.Nodes;
tvNodes.Clear();
tvNodes.Add("DllInfo");
AssemblyName dllAssemblyName = AssemblyName.GetAssemblyName(dllPath);
Assembly dllAssembly = Assembly.Load(dllAssemblyName);
Module[] modules = dllAssembly.GetModules();//获取作为程序集一部分的所有模块信息
Type[] types = dllAssembly.GetTypes();//获取程序集中定义的所有类型
AssemblyName[] referrenceAsseblies = dllAssembly.GetReferencedAssemblies();//获取程序集引用的程序集信息
tvNodes[0].Nodes.Add("基本信息");
string dllFullName = dllAssembly.FullName;
bool isGlobalAsseblyCache = dllAssembly.GlobalAssemblyCache;//是否从全局程序集加载
bool isFullTrusted = dllAssembly.IsFullyTrusted;//是否已完全信任方式加载的
Module manifestModule = dllAssembly.ManifestModule;//获取清单模块
bool isReflectionOnly = dllAssembly.ReflectionOnly;//是否加载到只反射模块中
//更新到节点
tvNodes[0].Nodes[0].Nodes.Add(string.Format("全路径:{0}", dllFullName));
tvNodes[0].Nodes[0].Nodes.Add(string.Format("是否全局程序集:{0}", isGlobalAsseblyCache));
tvNodes[0].Nodes[0].Nodes.Add(string.Format("是否全信任:{0}", isFullTrusted));
tvNodes[0].Nodes[0].Nodes.Add(string.Format("是否只反射:{0}", isReflectionOnly));
tvNodes[0].Nodes[0].Nodes.Add(string.Format("清单模块:{0}", manifestModule.Name));
IEnumerable<Type> exportedTypes = dllAssembly.ExportedTypes;//公共类型集合
tvNodes[0].Nodes.Add("模块信息");
int i = 0;
foreach (var module in modules)
{
FieldInfo[] fields = module.GetFields();//返回模块中定义的全局字段
MethodInfo[] methods = module.GetMethods();//返回模块中定义的全局方法
Type[] mtypes = module.GetTypes();//返回模块中定义的类型集合
bool isResource = module.IsResource();//指示此模块是否是资源
int mdStreamVersion = module.MDStreamVersion;//获取源数据流的版本
Guid versionId = module.ModuleVersionId;//获取模块的版本ID
string moduleName = module.Name;//获取模块的名称,去除路径的
int metadataToken = module.MetadataToken;
string scopeName = module.ScopeName;
tvNodes[0].Nodes[1].Nodes.Add(string.Format("模块:{0}", moduleName));
tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(string.Format("数据流版本:{0}", mdStreamVersion));
tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(string.Format("是否资源:{0}", isResource));
tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(string.Format("版本ID:{0}", versionId));
tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(string.Format("MetaData:{0}", metadataToken));
tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(string.Format("ScopeName:{0}", scopeName));
tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(GetNodes<FieldInfo>(fields, "公共字段"));
tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(GetNodes<MethodInfo>(methods, "Mehods"));
//tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(string.Format("Types:{0}", string.Join(",", mtypes.Select(p => p.Name))));
i++;
}
tvNodes[0].Nodes.Add("类型信息");
i = 0;
foreach (var type in types)
{
TypeAttributes typeAttributes = type.Attributes;//与Type关联的属性
string typeFullName = type.FullName;//获取类型的完全限定名称
FieldInfo[] typeFields = type.GetFields();//获取所有的公共字段
EventInfo[] typeEvents = type.GetEvents();//获取所有的 公共事件
Type[] typeInterfaces = type.GetInterfaces();//获取所有的公共接口
MemberInfo[] typeMembers = type.GetMembers();//获取所有的公共成员
MethodInfo[] typeMethods = type.GetMethods();//获取所有的公共方法
TypeInfo typeInfo = type.GetTypeInfo();//返回指定类型的表述形式
string nameSpace = type.Namespace; //指定类型的命名空间
string typeName = type.Name;//获取当前成员的名称
ConstructorInfo[] typeConstructors = type.GetConstructors();//类型的构造函数
tvNodes[0].Nodes[2].Nodes.Add(string.Format("类型:{0}", typeName));
tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(string.Format("全名称:{0}", typeFullName));
tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(string.Format("制定类型名称:{0}", typeInfo.Name));
tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(string.Format("命名空间:{0}", nameSpace));
tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(string.Format("接口:{0}", string.Join(",", typeInterfaces.Select(p => p.Name))));
tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(GetNodes<FieldInfo>(typeFields, "公共字段"));
tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(GetNodes<ConstructorInfo>(typeConstructors, "构造函数"));
tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(GetNodes<EventInfo>(typeEvents, "事件"));
tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(GetNodes<MemberInfo>(typeMembers, "成员Member"));
tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(GetNodes<MethodInfo>(typeMethods, "公共方法"));
i++;
}
}
}
/// <summary>
/// 通过类型获取节点
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="lstInfos"></param>
/// <param name="name"></param>
/// <returns></returns>
public TreeNode GetNodes<T>(T[] lstInfos, string name) where T : MemberInfo
{
TreeNode tNode = new TreeNode(name);
foreach (var t in lstInfos)
{
tNode.Nodes.Add(t.Name);
}
return tNode;
}
/// <summary>
/// 调用静态方法的例子
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnCallStaticByReflection_Click(object sender, EventArgs e)
{
AssemblyName assemblyName = AssemblyName.GetAssemblyName("TestAssembly.exe");
Assembly assembly = Assembly.Load(assemblyName);
Type t = assembly.GetType("TestAssembly.Program", true, true);
//object o= Activator.CreateInstance(t, false);
MethodInfo methodInfo = t.GetMethod("Main",BindingFlags.Static|BindingFlags.Public);
methodInfo.Invoke(null,new string[][] { new string[] { "g" } });
}
/// <summary>
/// 调用非静态方法的例子
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnCallFunctionByReflection_Click(object sender, EventArgs e)
{
AssemblyName assemblyName = AssemblyName.GetAssemblyName("TestAssembly.exe");//此处是相对路径
Assembly assembly = Assembly.Load(assemblyName);
Type t = assembly.GetType("TestAssembly.Program", true, true);
object o = Activator.CreateInstance(t, false);
MethodInfo methodInfo = t.GetMethod("TestAssembly", BindingFlags.Instance|BindingFlags.Public);
object tmp= methodInfo.Invoke(o,null);
MessageBox.Show(tmp.ToString());
}
}
动态加载和反射调用的功能还有很多,不能一一列举,只能在以后的工作中用到时再加以研究。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# C#
# 加载
# 程序集
# C#中调用DLL时未能加载文件或程序集错误的处理方法(详解)
# C# 程序集和反射详解
# C#使用反射加载多个程序集的实现方法
# C#中的程序集和反射介绍
# SQL Server中调用C#类中的方法实例(使用.NET程序集)
# C# 获取程序集版本、文件版本
# C# Assembly类访问程序集信息
# 在C#中如何获取程序集
# 请选择
# 它是
# 第二个
# 此类
# 所示
# 还有很多
# 时应
# 绑定
# 如下图
# 时再
# 新到
# 只能在
# string
# Text
# FileName
# btnLoadDll_Click
# Show
# return
# LoadDllInfo
相关文章:
如何选择适配移动端的WAP自助建站平台?
如何在宝塔面板中创建新站点?
南宁网站建设制作定制,南宁网站建设可以定制吗?
如何通过服务器快速搭建网站?完整步骤解析
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
建站之星如何通过成品分离优化网站效率?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
定制建站流程解析:需求评估与SEO优化功能开发指南
沈阳制作网站公司排名,沈阳装饰协会官方网站?
移民网站制作流程,怎么看加拿大移民官网?
如何选择可靠的免备案建站服务器?
制作门户网站的参考文献在哪,小说网站怎么建立?
宝塔新建站点为何无法访问?如何排查?
文字头像制作网站推荐软件,醒图能自动配文字吗?
如何快速搭建安全的FTP站点?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
如何自定义建站之星模板颜色并下载新样式?
如何做静态网页,sublimetext3.0制作静态网页?
如何选择建站程序?包含哪些必备功能与类型?
想学网站制作怎么学,建立一个网站要花费多少?
江苏网站制作公司有哪些,江苏书法考级官方网站?
建站之星如何实现PC+手机+微信网站五合一建站?
建站之星Pro快速搭建教程:模板选择与功能配置指南
如何自定义建站之星网站的导航菜单样式?
建站之星代理费用多少?最新价格详情介绍
css网站制作参考文献有哪些,易聊怎么注册?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
如何通过主机屋免费建站教程十分钟搭建网站?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
如何在IIS服务器上快速部署高效网站?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
如何在腾讯云服务器快速搭建个人网站?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
如何挑选优质建站一级代理提升网站排名?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
建站之星如何快速更换网站模板?
建站之星伪静态规则如何正确配置?
如何在阿里云通过域名搭建网站?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
如何通过多用户协作模板快速搭建高效企业网站?
如何解决VPS建站LNMP环境配置常见问题?
javascript基本数据类型及类型检测常用方法小结
如何在宝塔面板中修改默认建站目录?
制作宣传网站的软件,小红书可以宣传网站吗?
如何快速上传自定义模板至建站之星?
建站主机解析:虚拟主机配置与服务器选择指南
如何在云主机上快速搭建网站?
Bpmn 2.0的XML文件怎么画流程图
如何通过商城自助建站源码实现零基础高效建站?
*请认真填写需求信息,我们会在24小时内与您取得联系。