美文网首页
C#使用反射加载多个程序集

C#使用反射加载多个程序集

作者: 北风知我意 | 来源:发表于2017-01-08 13:51 被阅读108次

C#使用反射加载多个程序集

当开发插件的时候需要用到反射,在客户端动态加载遍历程序集,并调用每个程序集的方法。

创建一个控制台应用程序,首先设计一个接口:

publicinterface ISay

   {

void SaySth();

   }

在控制台应用程序下创建Plugins文件夹,控制台的可执行文件和所有程序集文件都生成在这里。右键控制台项目--"属性"--"生成",把"输出路径"设置成Plugins文件夹。

创建类库项目Assembly1,添加对控制台项目的引用,并创建实现ISay接口的类:

namespace Assembly1

{

publicclass OneSay : ISay

   {

publicvoid SaySth()

       {

           Console.WriteLine("我来自程序集1");

       }

   }

}

右键类库项目Assembly1--"属性"--"生成",把"输出路径"设置成Plugins文件夹,并生成类库项目Assembly1。

客户端需要找到所有程序集中所有实现ISay接口的类。其基本思路是:

→找到Plugins文件夹下所有dll后缀的文件

→遍历这些文件,根据文件名动态加载程序集

→遍历程序集中实现ISay接口的类型,并保存到ISay类型的集合中

→客户端遍历ISay类型的集合,调用ISay的接口方法

class Program

   {

staticvoid Main(string[] args)

       {

foreach (var say in GetSpeakers())

           {

               say.SaySth();

           }

       }

static List GetSpeakers()

       {

           List result = new List();

//获取项目根目录下的Plugins文件夹

string dir = Directory.GetCurrentDirectory();

//遍历目标文件夹中包含dll后缀的文件

foreach (var file in Directory.GetFiles(dir + @"\", "*.dll"))

           {

//加载程序集

               var asm = Assembly.LoadFrom(file);

//遍历程序集中的类型

foreach (var type in asm.GetTypes())

               {

//如果是ISay接口

if (type.GetInterfaces().Contains(typeof (ISay)))

                   {

//创建接口类型实例

                       var isay = Activator.CreateInstance(type) as ISay;

if (isay != null)

                       {

                           result.Add(isay);

                       }

                   }

               }

           }

return result;

       }

再创建一个类库项目Assembly2,添加对控制台项目的引用,并创建实现ISay接口的类:

namespace Assembly2

{

publicclass TwoSay : ISay

   {

publicvoid SaySth()

       {

           Console.WriteLine("我来自程序集2");

       }

   }

}

右键类库项目Assembly2--"属性"--"生成",把"输出路径"设置成Plugins文件夹,并生成类库项目Assembly2。

再次运行控制台项目。

相关文章

  • C#使用反射加载多个程序集

    C#使用反射加载多个程序集 当开发插件的时候需要用到反射,在客户端动态加载遍历程序集,并调用每个程序集的方法。 创...

  • C#反射

    C# 反射(Reflection) 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。程序集包含模块,而模...

  • c#加载程序集调用的方法说明

    程序集加载 程序集加载,CLR使用System.Reflection.Assembly.Load静态方法,当然这个...

  • 第二章 程序结构

    C# 中的关键组织结构概念包括程序、命名空间、类型、成员和程序集。 C# 程序由一个或多个源文件组成。 程序声明类...

  • 反射

    .Net Framework 中提供了反射机制,可以在加载程序运行时,动态获取和加载程序集(dll),并且可以获取...

  • 猿学-Java基础教程反射详解

    反射授课目录: ###01_反射(类的加载概述和加载时机) * A:类的加载概述 * 当程序要使用某个类时,如果该...

  • Unity 热更新为啥用Lua 详解

    他们说 阅读了网上一些文章,其实使用C#进行热更新是可以的,将需要更新的代码打包成程序集,然后利用反射即可,但是也...

  • 2021-07-07【c#】反射性能:比直接创建差30倍

    C# 直接创建多个类和使用反射创建类的性能 - lindexi - 博客园 (cnblogs.com)[https...

  • Unity 之如何写出强壮的代码

    【反射】 Unity C#基础之 反射反射,程序员的快乐 Unity C#基础之 特性,一个灵活的小工具 【多线程...

  • C#它山之石

    C# 使用反射技术实例化指定的类C#之玩转反射Reactive Extensions入门IoC solutions...

网友评论

      本文标题:C#使用反射加载多个程序集

      本文链接:https://www.haomeiwen.com/subject/ebvqbttx.html