Assembly动态加载程序集:
分两种情况:
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;