反射动态加载程序集Assembly.Load和Assembley.LoadFrom
抽象工厂需要借助反射机制来更好的实现,反射即动态加载某个程序集,从程序集中获得一个类从而动态实例化出一个对象。抽象加反射大大降低了耦合度。
动态加载程序集的有两种方法Assembly.Load和Assembly.LoadFrom。
Assembly.Load方法
Assembly.Load方法通过程序集的名称(包括程序集名,版本信息,语言文化,公钥标记)来加载程序集,而且会加载此程序集引用的其他程序集。Assembly.Load方法加载程序集步骤:如果程序集有强名称,在首先在全局程序集缓(GAC)中查找程序集,在程序集的强名称没有正确指定或GAC中找不到的情况下,通过配置文件中的<codebase>元素指定的URL来查找,最后在没有指定强名称或是在GAC中找不到,CLR会探测特定的文件夹中是否存在该程序集。
加载指定强名称的程序集Assembly.Load(“MyAssembly,Version=1.0.0.0,culture=zh-CN,PublicKeyToken=47887f89771bc57f”)此方法安全、效率高
加载若名称程序集方法Assembly.Load(“MyAssembly”)此方法很可能找不到该程序集,从而抛出异常。
Assembly.LoadFrom方法
Assembly.LoadFrom方法通过指定的路劲加载程序集,这个方法被调用的时候会将程序集版本,语言文化,公钥标记等信息传递给 Load方法,通过Load方法查找程序集,然后将找到程序集的路径与LoadFrom比较,如果路径相同,该程序集会被认为是应用程序的一部分,如果路径不同或Load方法没有找到程序集,那该程序集只是被作为一个“数据文件”来加载,不会被认为是应用程序的一部分。
加载指定路径下的程序集Assembly.LoadFrom(@”D:/Test/MyAssembly.dll”)标准写法
或Assembly.LoadFrom(” MyAssembly.dll”)这样程序会到指定文件夹下去查找名为MyAssembly.dll的程序集,一般文件夹为应用程序根目录下。