• C#生成/调用动态链接库


    参考地址:https://www.cnblogs.com/qq4004229/archive/2013/01/30/2882409.html

    一、需求描述

      (1)用代码生成动态链接库

      (2)用C#代码调用动态链接库

    二、生成动态链接库

      (1)新建类库

    (2)添加WelcomeInfo类

    代码如下(仅供测试用,例子很简单):

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace GenerateDLL
     8 {
     9     public class WelcomeInfo
    10     {
    11         public string ShowMsg(string name)
    12         {
    13             string str = "welcome " + name;
    14             return str;
    15         }
    16     }
    17 }

     (3)生成DLL动态链接库

      生成的dll在这里啦

    二、c#调用dll

      (1)新建一个控制台程序

      (2)方法一

     1             Assembly assembly = Assembly.LoadFile("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll");
     2 
     3             //获取类型,参数(命名空间+类)   
     4             Type type = assembly.GetType("GenerateDLL.WelcomeInfo");
     5 
     6             //创建该对象的实例,object类型,参数(命名空间+类)   
     7             object instance = assembly.CreateInstance("GenerateDLL.WelcomeInfo");
     8 
     9             //设置方法中的参数类型,Type[]类型;如有多个参数可以追加多个   
    10             Type[] params_type = new Type[1];
    11             params_type[0] = Type.GetType("System.String");
    12             //设置方法中的参数值;如有多个参数可以追加多个   
    13             Object[] params_obj = new Object[1];
    14             params_obj[0] = "Lucy";
    15 
    16             //执行ShowMsg方法   
    17             string str = type.GetMethod("ShowMsg", params_type).Invoke(instance, params_obj).ToString();
    18             Console.WriteLine(str);
    19             Console.Read();

      (3)方法二

     1             Assembly assembly = Assembly.LoadFile("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll");
     2             //获取类型,参数(命名空间 + 类)   
     3             Type typeDBHelpher = assembly.GetType("GenerateDLL.WelcomeInfo");
     4             object oDBHelper = Activator.CreateInstance(typeDBHelpher);
     5             //需要调用的方法名
     6             MethodInfo method = typeDBHelpher.GetMethod("ShowMsg");
     7             //参数集合
     8             object v = method.Invoke(oDBHelper, new object[] { "Lucy" });
     9             string str = v.ToString();
    10             Console.WriteLine(str);
    11             Console.Read();

    说明:两个方法大同小异,只是个别写法不一样,我个人更喜欢用第一种方法,感觉思路更清晰。

    (3)效果

    三、调用dll一次之后,就不能进行调用了,提示dll被占用的解决方案

     1             //Assembly assembly = Assembly.LoadFile("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll");
     2             //此处改成这种方式即可
     3             byte[] byteDLL = System.IO.File.ReadAllBytes("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll");
     4             Assembly assembly = Assembly.Load(byteDLL);
     5             //获取类型,参数(命名空间+类)   
     6             Type type = assembly.GetType("GenerateDLL.WelcomeInfo");
     7 
     8             //创建该对象的实例,object类型,参数(命名空间+类)   
     9             object instance = assembly.CreateInstance("GenerateDLL.WelcomeInfo");
    10 
    11             //设置方法中的参数类型,Type[]类型;如有多个参数可以追加多个   
    12             Type[] params_type = new Type[1];
    13             params_type[0] = Type.GetType("System.String");
    14             //设置方法中的参数值;如有多个参数可以追加多个   
    15             Object[] params_obj = new Object[1];
    16             params_obj[0] = "Lucy";
    17 
    18             //执行ShowMsg方法   
    19             string str = type.GetMethod("ShowMsg", params_type).Invoke(instance, params_obj).ToString();
    20             Console.WriteLine(str);
    21             Console.Read();

     疑问:之前是在同一个页面既生成dll,又调用dll,就会出现“被占用”的错误,而且也无法多次调用同一dll。这次调用多次,也没有出现这个错误,不知是什么原因,有时间还得再实验下。

  • 相关阅读:
    Ubuntu下多版本软件的管理
    关于高考
    Openca安装笔记
    Nginx+uwsgi+python配置
    cpabe的安装
    线形同余法求随机数
    world wind 之 applet 篇
    0909 海贼王我当定了
    实验0:了解和熟悉操作系统
    0316复利计算器3.0
  • 原文地址:https://www.cnblogs.com/jas0203/p/9946098.html
Copyright © 2020-2023  润新知