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

一、需求描述

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

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

二、生成动态链接库

(1)新建类库

(2)添加WelcomeInfo类

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

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace GenerateDLL
{
public class WelcomeInfo
{
public string ShowMsg(string name)
{
string str = "welcome " + name;
return str;
}
}
}

(3)生成DLL动态链接库

生成的dll在这里啦

二、c#调用dll

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

(2)方法一

             Assembly assembly = Assembly.LoadFile("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll");

             //获取类型,参数(命名空间+类)
Type type = assembly.GetType("GenerateDLL.WelcomeInfo"); //创建该对象的实例,object类型,参数(命名空间+类)
object instance = assembly.CreateInstance("GenerateDLL.WelcomeInfo"); //设置方法中的参数类型,Type[]类型;如有多个参数可以追加多个
Type[] params_type = new Type[];
params_type[] = Type.GetType("System.String");
//设置方法中的参数值;如有多个参数可以追加多个
Object[] params_obj = new Object[];
params_obj[] = "Lucy"; //执行ShowMsg方法
string str = type.GetMethod("ShowMsg", params_type).Invoke(instance, params_obj).ToString();
Console.WriteLine(str);
Console.Read();

(3)方法二

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

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

(3)效果

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

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

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

C#生成/调用动态链接库的更多相关文章

  1. Qt调用VC++生成的动态链接库

    Qt如何调用VC++生成的动态链接库?假设当前有VC++编译器生成的动态库文件testdll.h,testdll.lib和testdll.dll. testdll.h文件源码如下: #ifdef TE ...

  2. Qt不同版本编译器,调用VC++生成的动态链接库

    今天用QT编译生成的共享库自己却怎么都不能调用,查了N久后找到这个帖子,发现搞定了,记录一下 http://qiusuoge.com/12720.html Qt如何调用VC++生成的动态链接库?假设当 ...

  3. VS2010创建和调用动态链接库

    当我们开发一个产品的时候,我们并不想把源码公布给对方,除了给对方提供exe可执行文件外,我们还可以生成动态链接库,供程序调用,方便二次开发. 下面我将简单梳理一下如何创建和调用动态链接库,方便大家程序 ...

  4. VC++ 6.0如何创建与调用动态链接库

    原文:http://blog.csdn.net/wanghaihao_1/article/details/51098451 1.静态链接库与动态链接库区别: 静态链接库:lib中的指令被直接包含在最终 ...

  5. Java调用动态链接库so文件(传参以及处理返回值问题)

    刚来到公司,屁股还没坐稳,老板把我叫到办公室,就让我做一个小程序.我瞬间懵逼了.对小程序一窍不通,还好通过学习小程序视频,两天的时间就做了一个云开发的小程序,但是领导不想核心的代码被别人看到,给了我一 ...

  6. BCB如何编写,调用动态链接库DLL

    一 编写动态链接库DLL DLL简称动态链接库,是Windows中程序的重要组成部分.想象一下,一个程序需要多人共同完成开发,怎么个共同法?这时我们就要考虑把程序分为好几个模块,团队每一个成员开发一个 ...

  7. 跨平台开发 -- C# 使用 C/C++ 生成的动态链接库

    操作环境:Visual Studio 2017 如何实现 使用 C# 进行嵌入式开发? .NET Core 虽然实现了跨平台,但是不可能处处使用 C# 开发,就好像没人使用SQL开发安卓APP,每种语 ...

  8. python中使用ctypes调用MinGW生成的动态链接库(dll)

    关于gcc编译dll的我就不说了,网上举例一大堆,下面以g++为例. 假设有一个test.cpp文件如下: extern "C" { __declspec(dllexport) d ...

  9. C#调用C++生成的动态链接库DLL

    一.背景 由于要使用C#写app,所以要把C++生成的DLL在C#中调用,所以就涉及怎样去调用外部的dll问题. 二.C#调用外部DLL 首先先看下C#调用外部DLL的代码 using System. ...

随机推荐

  1. JavaScript模拟call和apply的实现

    参考: call和apply的模拟实现 1. call:调用一个对象的一个方法,用另一个对象替换当前对象.例如:B.call(A, args1,args2);即A对象调用B对象的方法. /*call( ...

  2. Consul 学习资料

    资料 网址 Consul 入门指南 https://book-consul-guide.vnzmi.com/

  3. nginx 代理服务

    1.nginx反向代理服务 location ~ /test_proxy.html$ { proxy_pass http://127.0.0.1:8080;(代理访问127.0.0.1:8080) } ...

  4. 用JSON.parse(JSON.stringify(itemData))序列化反序列化实现‘深度复制’

    还可以用来去除值不具有JSON 表示形式(数字.字符串.逻辑值.数组.对象.null)的属性,也就是说像undefined和function这样的属性值.

  5. HTML基础二-DOM操作

    http://www.imdsx.cn/index.php/2017/07/27/html2/ DOM(Document Object Model 文档对象模型) 一个web页面的展示,是由html标 ...

  6. bootstrap基础自我总结

    *今天自学了一些封装的css,看起来官网很强大,但是因为源码备注都是英文的情况下,还是感觉想深入有点力不从心,发现度娘没有中文手册,无奈,不过还好代码无国界,基本都是能看懂的,备注也影响不大(安慰自己 ...

  7. STL 二分查找

    实现源码:https://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html 1.在一个递增的数组(或vector)中查找元素属于[ s , ...

  8. 第03组 Beta冲刺(4/4)

    队名:不等式方程组 组长博客 作业博客 团队项目进度 组员一:张逸杰(组长) 过去两天完成的任务: 文字/口头描述: 制定了初步的项目计划,并开始学习一些推荐.搜索类算法 GitHub签入纪录: 暂无 ...

  9. UID、PID、PPID是什么?

    UID是用户ID,PID是进程ID,PPID是父进程ID. UID UID 用户身份证明(User Identification)的缩写.UID用户在注册后,系统会自动的给你一个UID的数值.意思就是 ...

  10. 对C++11中的`移动语义`与`右值引用`的介绍与讨论

    本文主要介绍了C++11中的移动语义与右值引用, 并且对其中的一些坑做了深入的讨论. 在正式介绍这部分内容之前, 我们先介绍一下rule of three/five原则, 与copy-and-swap ...