zoukankan      html  css  js  c++  java
  • 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。这次调用多次,也没有出现这个错误,不知是什么原因,有时间还得再实验下。

  • 相关阅读:
    编写高质量代码改善C#程序的157个建议——建议68:从System.Exception或其他常见的基本异常中派生异常
    编写高质量代码改善C#程序的157个建议——建议67:慎用自定义异常
    编写高质量代码改善C#程序的157个建议——建议66:正确捕获多线程中的异常
    编写高质量代码改善C#程序的157个建议——建议65:总是处理未捕获的异常
    编写高质量代码改善C#程序的157个建议——建议64:为循环增加Tester-Doer模式而不是将try-catch置于循环内
    编写高质量代码改善C#程序的157个建议——建议63:避免“吃掉”异常
    编写高质量代码改善C#程序的157个建议——建议62:避免嵌套异常
    Django详细介绍
    Django【进阶篇 】
    Django【基础篇】
  • 原文地址:https://www.cnblogs.com/jas0203/p/9946098.html
Copyright © 2011-2022 走看看