如何添加程序集的引用?
直接添加程序集路径或者添加解决方案中的项目引用。
当我们需要扩展一个程序的时候,你可能会直接在原有的项目中进行添加,那这样的话,如果你的这些代码想共享给别人使用呢?你就可以打包成一个程序集,然后别人只要通过引用你这个程序集就可以进行扩展了。像我们常见的.net第三方框架库,如log4net、unity等等。
注意:不能添加循环引用
什么是添加循环引用?就是说A项目如果添加了B项目的项目引用,那么此时B项目不能再添加A项目的项目引用,也就是说添加项目引用时,必须是单向的,像我们常见的三层框架之间的项目引用。
反射
关于反射,你只要是做.net开发,你就一定天天在用。因为VS的智能提示就是通过应用了反射技术来实现的,还有我们常用的反编译神器Reflector.exe,看它的名字就知道了。项目中比较常见的,是通过结合配置文件来动态实例化对象,如切换数据库实例,或者Sprint.net的通过配置文件来实现依赖注入等。
反射技术其实就是动态获取程序集的元数据的功能,反射通过动态加载dll,然后对其进行解析,从而创建对象,调用成员。
Type是对类的描述,Type类是实现反射的一个重要的类,通过它我们可以获取类中的所有信息,包括方法、属性等。可以动态调用类的属性、方法。
反射的出现让创建对象的方式发生了改变,因为过去面完创建对象都是直接通过new。
dll里面有两部分东西:IL中间语言和metadate元素据。
在.NET中反射用到命名空间是System.Reflection,这里我先通过一个Demo来看反射能做些什么
1、 新建控制台项目ReflectedDemo
2、 新建类库项目My.Sqlserver.Dal
新建两个类SqlServerHelper和SqlCmd,前者为共有类,后者为私有类
namespace My.Sqlserver.Dal
{
public class SqlServerHelper
{
private int age = 16;
public string Name { get; set; }
public string Query()
{
return string.Empty;
}
}
class SqlCmd
{
}
}
3、 项目ReflectedDemo,添加My.Sqlserver.Dal的项目引用,我这样做的目的是为了方便项目ReflectedDemo中的bin目录中时刻存在My.Sqlserver.Dal.dll程序集。
using System;
using System.Reflection;
namespace ReflectedDemo
{
class Program
{
static void Main(string[] args)
{
//加载程序集文件,在bin目录中查找
Assembly assembly = Assembly.Load("My.Sqlserver.Dal");
Console.WriteLine("----------------Modules----------------------");
var modules = assembly.GetModules();
foreach(var module in modules)
{
Console.WriteLine(module.Name);
}
Console.WriteLine("----------------Types----------------------");
var types = assembly.GetTypes(); //获取程序集中所有的类型,包括公开的和不公开的
foreach(var type in types)
{
Console.WriteLine(type.Name);
Console.WriteLine(type.FullName);
var members= type.GetMembers(); //获取Type中所有的公共成员
Console.WriteLine("----------------members----------------------");
foreach(var m in members)
{
Console.WriteLine(m.Name);
}
}
Console.WriteLine("----------------GetExportedTypes----------------------");
var exportedTypes = assembly.GetExportedTypes(); //获取程序集中所有的公共类型
foreach(var t in exportedTypes)
{
Console.WriteLine(t.Name);
}
Console.WriteLine("----------------GetType----------------------");
var typeName= assembly.GetType("SqlServerHelper");//获取程序集中指定名称的类型对象
Console.WriteLine(typeName.Name);
}
}
}










