分两种情况:
1、需要加载的程序集已经在程序中被引用了,则直接从当前程序域中查找即可:
Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.GetName().Name.Contains("theAssemblyName"));
2、需要加载的程序集未被加载,则使用程序集名称加载:
方法一,需要具体程序集的一些必要信息,如下:
Assembly assembly = Assembly.Load(@"theAssemblyName, Version=55.0.0.0, Culture=neutral, PublicKeyToken=ef0f902af9dee505");
说明:theAssemblyName:为程序集的名称,Version:为程序集的版本,Culture:一般默认使用neutral,PublicKeyToken:为程序集的唯一标识ID,没有;上述信息可以在程序集项目中 AssemblyInfo.cs文件中获取,如下图:
方法二,通过程序集文件路径加载,只加载程序集文件,不加载程序集依赖的其它程序集,如下:
Assembly assembly = Assembly.LoadFile(具体路径+ "DynamicReferenceDLL.dll")
方法三,通过程序集文件路径加载,同时将此程序集所依赖的程序集也加载进来,如下:
Assembly assembly = Assembly.LoadFrom(具体路径+ "DynamicReferenceDLL.dll")
使用反射创建实例:
//获取程序集中指定的类类型,参数为:命名空间.类型名
var type = assembly.GetType("DynamicReferenceDLL.MyMath");
//创建实例,方法一
//var obj = Activator.CreateInstance(type);
//创建实例,方法二 ,参数为:命名空间.类型名
var obj = assembly.CreateInstance("DynamicReferenceDLL.MyMath");
//获取实例中的方法
var method = type.GetMethod("Sum");
//调用实例方法
object result=method.Invoke(obj, new object[] { 1, 2 });
Console.WriteLine(result);
如何获取程序集的文件的
PublicKeyToken,Culture,Version
:
Assembly assembly = Assembly.LoadFile(@"C:\Program Files\ReferencedAssemblies\theAssemblyName.dll");
string name = assembly.FullName;
Assembly动态加载程序集:分两种情况:1、需要加载的程序集已经在程序中被引用了,则直接从当前程序域中查找即可:Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.GetName().Name.Contains("theAssemblyName"));2、需要加载的程序集未被加载,则使用程序集名称加载:方法一,需要具体程序集的一些必要信息,如下:Ass..
2.没有权限的时候
.net自带的一个工具可以将dll注册到GAC中去的,gacutil.exe。
开始菜单-Microsoft Visual Studio 2010 -Visual Studio Tools-Visual Studio 命令提示(2008),在控制台中输入 gacutil.exe 回车,既可以看到一些参数。
要安装dll到GAC中的话选择-i参数
Assembly assembly1 = Assembly.LoadFile("程序集路径,不能是相对路径");
//无参构造函数
object objNoParam = assembly1.CreateInstance("命名空间.具体类型");
assembly1.C.
public class DoNetDllClass
public UInt32 SeedAndKeyFunc(UInt32 level, UInt32 len, byte[] seed, byte[] key)
key[0] = 0x11;
key[1] = 0x11;
反射常常与接口、依赖反转原则一起使用。反射事实上是.Net框架的内容,不是C#语言的内容。
对于托管类语言,反射很重要。单元测试、依赖注入、泛型编程,都基于反射机制。
反射的实质其实就是:给我一个对象,我能在不知道它是什么静态类型,且不使用new操作符的情况下,再创建出一个与它同类型的新对象,并且能够访问其方法。
从定义来看,反射有两方面好处。
一方面,我们知道,使用new操作符,即是创造了一个紧耦合,直接地将所在类与new后的静态类型紧耦合在了一起。而使用反射,直接避免紧耦合的发生,降低了耦合度。
简记个人博客网站源码为博主现有博客网站,前端采用LayUI框架,此分享版本为asp + access。所有功能齐全,欢迎使用。
使用方法:上传至空间或服务器,通过IIS发布网站即可。
演示地址:https://shenco.wang/show_1427.html
1、本博客前后台融合,通过账号权限控制。
2、普通账号可以通过注册登陆,管理员授权后可发布文章。
3、管理员登陆地址隐藏在归档-登陆上,点击管理员输入密码(gggaiitx)即可登陆。
1.返回指定目录中与指定搜索模式匹配的文件名称
string[] all
Dll = Directory.GetFiles(“C:\新文件夹或者直接写文件名字”, “*.
dll”);
2.已知
程序集的文件名或路径,
加载程序集
Assembly assembly =
Assembly.LoadFrom(all
Dll[i]);
3.GetExportedTypes:获取此
程序集的公共类型,这些公共类型在
程序集外可见
4.
assembly.GetExportedTypes():只获取那些public的类型
将下列文字整理成表格:使⽤print、whatis命令\nprint 表达式:简记为 p ,其中“表达式”可以是任何当前正在被测试程序的有效表达式,⽐如当前正在调试C语⾔的程序,那么“表达\n式”可以是任何C语⾔的有效表达式,包括数字,变量甚⾄是函数调⽤。\nprint a:将显⽰整数 a 的值\nprint ++a:将把 a 中的值加1,并显⽰出来\nprint name:将显⽰字符串 name 的值\nprint gdb_test(22):将以整数22作为参数调⽤ gdb_test() 函数\nprint gdb_test(a):将以变量 a 作为参数调⽤ gdb_test() 函数\ndisplay 表达式:在单步运⾏时将⾮常有⽤,使⽤display命令设置⼀个表达式后,它将在每次单步进⾏指令后,紧接着输出被设置的表\n达式及值。如: display a\nwatch 表达式:设置⼀个监视点,⼀旦被监视的“表达式”的值改变,gdb将强⾏终⽌正在被调试的程序。如: watch a\nwhatis :查询变量或函数\ninfo function: 查询函数\ninfo locals: 显⽰当前堆栈页的所有变量\ncall 函数(参数):调⽤程序中可见的函数,并传递“参数”,如:call gdb_test(55);
命令 | 描述
------------ | -------------
print 表达式 |
简记为 p ,其中“表达式”可以是任何当前正在被测试
程序的有效表达式,如当前正在调试C语言的
程序
print a | 将显示整数 a 的值
print ++a | 将把 a 中的值加1,并显示出来
print name | 将显示字符串 name 的值
print gdb_test(22) | 将以整数22作为参数调用 gdb_test() 函数
print gdb_test(a) | 将以变量 a 作为参数调用 gdb_test() 函数
display 表达式 | 在单步运行时将非常有用,
使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值
watch 表达式 | 设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的
程序
whatis | 查询变量或函数
info function | 查询函数
info locals | 显示当前堆栈页的所有变量
call 函数(参数) | 调用
程序中可见的函数,并传递“参数”