C#反射加载程序集并使用

具体实现参考:

C# 动态加载DLL通过反射调用参数、方法、窗体_c#反射加载dll并传入参数-CSDN博客

C#进阶学习--反射(Reflection) - 知乎

走进C#反射机制 - 知乎

1.使用过程
//创建数据集
Assembly outerAsm = Assembly.LoadFile("D:/your.dll");

//获取调用类型声明,要把命名空间带上
Type typeClass = outerAsm.GetType("namespace1.classNameA");

//获取静态方法声明
MethodInfo methodStatic = typeClass1.GetMethod("staticFunc");

//调用静态方法
object methoVal = methodStatic.Invoke(null, null);

//创建实体,有参构造
object obj1 = Activator.CreateInstance(typeClass, new object[]{ para1,para2,...,paraN });

//创建实体,无参构造
object obj2 = Activator.CreateInstance(typeClass, null });

//获取非静态方法声明
MethodInfo methodGetInit = typeProduct.GetMethod("nonStaticFunc");

//调用无参非静态方法
ethodGetInit.Invoke(obj1 , null);

//获取名为Property1的访问器
PropertyInfo propertyInfo = typeProduct.GetProperty("Property1");声明

//获取product中名为Property1的访问器的值
object obj1 = propertyInfo.GetValue(product);
2.loadfrom、loadfile

参考:Assembly.LoadFile 方法 (System.Reflection) | Microsoft Learn

1)loadfrom

加载程序集的时候会连带性的加载,会连带把该文件所依赖的dll也加载

2)loadfile

仅加载一个文件,不会连带把该文件所依赖的dll也加载

3.其他补充

1)当前,在一个AppDomain中只能加载dll,不能卸载,因此在一个AppDomain中不能有同名的dll程序集

2)一个线程属于一个AppDoMain

参考:C# AppDomain 详解

3)AssemblyResolve

AssemblyResolve一般配合load方法使用,在load方法找不到程序集的时候,会调用AssemblyResolve解决冲突

AppDomain.CurrentDomain.AssemblyResolve -= OnAssemblyResolve;
List<string> Searchs = new List<string>() {"path1","path2" };
Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
{
    var assemblyName = new AssemblyName(args.Name);

    foreach(var item in Searchs)
    {
        var file = string.Format("{0}.dll", System.IO.Path.Combine(item, assemblyName.Name));
        if (File.Exists(file))
        {
            return Assembly.LoadFile(file);
        }
    }

    return args.RequestingAssembly;
}

4)常见的冲突

要动态加载的dll跟输出目录中的dll冲突了,尤其是调用loadfrom的时候,其所依赖的dll一般会从输出目录中获取,但是输出目录中的dll并不是你想要的依赖版本,这时候就会冲突

相关推荐

  1. C#反射程序使用

    2023-12-09 05:44:07       59 阅读
  2. 微信小程序使用上拉实现图片懒

    2023-12-09 05:44:07       29 阅读
  3. C# 反射创建实例赋值

    2023-12-09 05:44:07       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-09 05:44:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-09 05:44:07       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-09 05:44:07       82 阅读
  4. Python语言-面向对象

    2023-12-09 05:44:07       91 阅读

热门阅读

  1. 蓝桥杯:货物摆放

    2023-12-09 05:44:07       56 阅读
  2. react的sass模块化引入

    2023-12-09 05:44:07       62 阅读
  3. 更新 Node.js 和 npm 使用 nvm

    2023-12-09 05:44:07       61 阅读
  4. kubernetes的服务发现(二)

    2023-12-09 05:44:07       59 阅读
  5. 阿里云安装docker

    2023-12-09 05:44:07       62 阅读
  6. 智能淘客查券返利机器人与导购app:差异与优势

    2023-12-09 05:44:07       56 阅读
  7. 【游戏引擎 - C#脚本系统】6、C#端调用C++函数

    2023-12-09 05:44:07       53 阅读
  8. 旅游产品经理常用的ChatGPT通用提示词模板

    2023-12-09 05:44:07       52 阅读
  9. 硬件产品经理常用的ChatGPT通用提示词模板

    2023-12-09 05:44:07       55 阅读
  10. 麒麟V10服务器安装Apache+PHP

    2023-12-09 05:44:07       48 阅读
  11. 华为、华三、锐捷、思科巡检命令大全

    2023-12-09 05:44:07       144 阅读