一、写在前面
C# 语言是一种简单但功能强大的编程语言,用于编写企业应用程序。

C# 语言从C和 C++语言演化而来,在语句、表达式和运算符方面使用了许多 C++ 功能。

C# 语言在类型安全性、版本转换、事件和垃圾回收等方面进行了相当大的改进和创新。

C# 语言提供对常用 API 样式(如 .NET 框架、COM、自动化和 C 样式 API 等)的访问。

什么是动态链接库?DLL三个字母对于你来说一定很熟悉吧,它是Dynamic Link Library 的缩写形式,动态链接库 (DLL) 是作为共享函数库的可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。

和大多数程序员一样,你一定很使用过DLL吧。也曾感受到它的带给你程序设计和编码上的好错吧今天我想和大家探讨一个主题:如何在C#创建和调用DLL(动态链接库), 其实在很大意义上而讲,DLL让我更灵活的组织编写我们的应用程序,作为软件设计者,可一个根据它来达到很高的代码重用效果。下面我来介绍一下在C#中如何创建和调用DLL。

二、准备工作

我们需要对我们接下来要做的事情做个简单的介绍,在本文我们将利用C#语言创建一个名为 MyDLL.DLL的动态链接库,在这个动态链接库文件中我们将提供两个功能一个是对两个参数交换他们的值,另一个功能是求两个参数的最大公约数。然后创建一个应用程序使用这个DLL。运行并输出结果。

三、创建DLL

让我们创建以下三个C#代码文件:

1、 MySwap.cs

using System;

namespace MyMethods

{

public class SwapClass

{

public static bool Swap(ref long i,ref long j)

{

i = i+j;

j = i-j;

i = i-j;

return true;

}

}

}

2、 MyMaxCD.cs

using System;

namespace MyMethods

{

public class MaxCDClass

{

public static long MaxCD(long i, long j)

{

long a,b,temp;

if(i>j)

{

a = i;

b = j;

}

else

{

b = i;

a = j;

}

temp = a % b;

while(temp!=0)

{

a = b;

b = temp;

temp = a % b;

}

return b;

}

}

}

}需要注意的是:我们在制作这两个文件的时候可以用Visual Studio.NET或者其他的文本编辑器,就算是记事本也可以。这两个文件虽然不在同一个文件里面,但是他们是属于同一个namespace(名称空间)这对以后我们使用这两个方法提供了方便。当然他们也可以属于不同的名称空间,这是完全可以的,但只是在我们应用他们的时候就需要引用两个不同的名称空间,所以作者建议还是写在一个名称空间下面比较好。
接下来的任务是把这两个cs文件变成我们需要的DLL文件。方法是这样的:
在安装了Microsoft.NET Framework的操作系统上,我们可以在Windows所在目录下找到Microsoft.NET目录。在这个目录下面提供了C#的编译器,CSC.EXE
运行:csc /target:library /out:MyDLL.DLL MySwap.cs MyMaxCD.cs
完成后可在本目录下面找到我们刚才生成的MyDLL.DLL文件
/target:library 编译器选项通知编译器输出 DLL 文件而不是 EXE 文件。后跟文件名的 /out 编译器选项用于指定 DLL 文件名。
如果/out后面不跟文件名编译器使用第一个文件 (MySwap.cs) 作为 DLL 文件名。生成的文件为MySwap.DLL文件
OK!我们创建动态链接库文件的任务完成了,现在是我们享受劳动成果的时候了,下面我将介绍如何使用我们所创建的动态链接库文件。

四、 使用DLL

我们简单写一个小程序来测试一下我们刚才写的两个方法是否正确,好吧,跟我来:
MyClient.cs
using System;

using MyMethods;

//这里我们引用刚才定义的名称空间,如果刚才的两个文件我们写在两个不同的名称空间
class MyClient

{

public static void Main(string[] args)

{

if (args.Length != 2)

{

Console.WriteLine("Usage: MyClient <num1> <num2>");

return;

}

long num1 = long.Parse(args[0]);

long num2 = long.Parse(args[1]);

SwapClass.Swap(ref num1,ref num2);

// 请注意,文件开头的 using 指令使您得以在编译时使用未限定的类名来引用 DLL 方法

Console.WriteLine("The result of swap is num1 = {0} and num2 ={1}",num1, num2);

long maxcd = MaxCDClass.MaxCD(num1,num2);

Console.WriteLine("The MaxCD of {0} and {1} is {2}",num1, num2, maxcd);

}

}

若要生成可执行文件 MyClient.exe,请使用以下命令行:

csc /out:MyClient.exe /reference:MyLibrary.DLL MyClient.cs

/out 编译器选项通知编译器输出 EXE 文件并且指定输出文件名 (MyClient.exe)。/reference 编译器选项指定该程序所引用的 DLL 文件。

五、执行

若要运行程序,请输入 EXE 文件的名称,文件名的后面跟两个数字,例如:

MyClient 123 456

六、输出

The result of swap is num1 = 456 and num2 = 123

The MaxCD of 456 and 123 is 3

七、小结

动态链接具有下列优点:

节省内存和减少交换操作。很多进程可以同时使用一个 DLL,在内存中共享该 DLL 的一个副本。相反,对于每个用静态链接库生成的应用程序,Windows 必须在内存中加载库代码的一个副本。
节省磁盘空间。许多应用程序可在磁盘上共享 DLL 的一个副本。相反,每个用静态链接库生成的应用程序均具有作为单独的副本链接到其可执行图像中的库代码。
升级到 DLL 更为容易。DLL 中的函数更改时,只要函数的参数和返回值没有更改,就不需重新编译或重新链接使用它们的应用程序。相反,静态链接的对象代码要求在函数更改时重新链接应用程序。
提供售后支持。例如,可修改显示器驱动程序 DLL 以支持当初交付应用程序时不可用的显示器。
支持多语言程序。只要程序遵循函数的调用约定,用不同编程语言编写的程序就可以调用相同的 DLL 函数。程序与 DLL 函数在下列方面必须是兼容的:函数期望其参数被推送到堆栈上的顺序,是函数还是应用程序负责清理堆栈,以及寄存器中是否传递了任何参数。
提供了扩展 MFC 库类的机制。可以从现有 MFC 类派生类,并将它们放到 MFC 扩展 DLL 中供 MFC 应用程序使用。
使国际版本的创建轻松完成。通过将资源放到 DLL 中,创建应用程序的国际版本变得容易得多。可将用于应用程序的每个语言版本的字符串放到单独的 DLL 资源文件中,并使不同的语言版本加载合适的资源。
使用 DLL 的一个潜在缺点是应用程序不是独立的;它取决于是否存在单独的 DLL 模块。

C#创建和调用DLL相关推荐

  1. C++ Builder创建和调用dll中的资源

    程序开发中经常会用到一些图标.图片.光标.声音等,我们称它们为资源(Resource).当多个窗口用到同样的资源时,可以将这些公共的资源放到一个dll文件里调用,这样,由于定位资源比在磁盘中定位文件花 ...

  2. 利用QT5.9创建并调用DLL(基于Visual Studio 2015)

    最近在做QT相关的项目,需要用到DLL,看了下网上的有关QT创建DLL的教程,大多数都是在QT Creator里面的.基于Visual Studio的非常少,这里就记录下自己走过的那些坑. 准备工作. ...

  3. MFC创建、调用Dll的方法

    1. MFC创建DLL 1. 打开VS,新建项目,选择"MFC动态链接库",点击"下一步". 2. 设置项目名,路径等参数,点击"创建". ...

  4. VS2019-C++创建和调用DLL动态链接库(傻瓜式教程)

    前言:查了好久好久网上的资料C++调用动态链接库,试了好多方法(直接创建DLL.空项目创建的)都多多少少有些问题,最后自己不断摸索着成功了,还是很开心的,接下来把最清晰的步骤分享给大家(C++新人,有 ...

  5. dll创建及调用(VS2005)

    最近改用vs2005做项目,主要写算法类库,下面贴一个基础内容,如何使用VS2005创建及调用dll 贴个链接,验证过可以正确运行:http://blog.csdn.net/zyhui65/artic ...

  6. vs2008 C++创建和调用标准DLL

    为了共享代码,需要生成标准的dll,本文将介绍在vs2008 C++生成及调用dll. 一.生成DLL 生成一个名为FunDll的dll文件,对外函数为addl. step1:vs2008 环境下,文 ...

  7. Qt DLL总结-创建及调用QT的 DLL

    目录 Qt DLL总结[一]-链接库预备知识 Qt DLL总结[二]-创建及调用QT的 DLL Qt DLL总结[三]-VS2008+Qt 使用QPluginLoader访问DLL 开发环境:VS20 ...

  8. Qt DLL总结【二】-创建及调用QT的 DLL

    目录 Qt DLL总结[一]-链接库预备知识 Qt DLL总结[二]-创建及调用QT的 DLL Qt DLL总结[三]-VS2008+Qt 使用QPluginLoader访问DLL 开发环境:VS20 ...

  9. 动态链接库DLL创建及导出函数、调用DLL

    1.动态链接库(dll)概述 没接触dll之前觉得它很神秘,就像是一个黑盒子,既不能直接运行,也不能接收消息.它们是一些独立的文件,其中包含能被可执行程序或其他dll调用来完成某项工作的函数,只有在其 ...

最新文章

  1. 中国人民大学文继荣:搜索,从相关性到有用性
  2. poj 1781 In Danger
  3. onenote怎么同步到电脑_详解onenote保存与同步④:本地笔记奇葩的丢失经历
  4. linux下各种软件安装方法详解
  5. 服务器电源can协议,硬件接口协议之“CAN总线EMC设计”
  6. 中小企业如何提高售前,售中,售后客服质量?
  7. leetcode-187-重复的DNA序列
  8. [转载] Java中的静态方法不能被子类重写
  9. UIWebView加载Loading...两种方法
  10. chattr 改变文件的扩展属性
  11. vga/dvi/hdmi/dp
  12. mumu的adb_MuMu模拟器进行adb操作
  13. STM32 W5500 MQTT Client 发布订阅及断线重连
  14. 网页图片+文字并排显示效果
  15. 串口协议和 stm32CubeMX实例、keil波形观测
  16. 杜国光博士,基于视觉的机器人抓取--物体定位,位姿估计到抓取估计课堂笔记
  17. Docker(感谢狂神)
  18. 蓝旭后端第六次培训课 MySQL(二)
  19. Sophos防火墙v18版本访问内部服务器或者电脑SNAT地址转换的问题解决办法
  20. 照葫芦画瓢之python爬虫系列----(2)初次爬取简单的动态网页数据(网易、QQ音乐排行榜)

热门文章

  1. java 初始化系统参数_系统中参数的初始化 参数在系统中配置
  2. ubuntu18.04上安装TensorFlow2.0
  3. 解决Mask RCNN自己航拍数据集训练的问题
  4. C语言实现将彩色bmp图像转化为灰图、灰度图像反色
  5. 【ios开发/Xcode】实现关键字检索
  6. java菜单动态加载功能_Javascript实现动态菜单添加
  7. 史上最简单粗暴获取阿里巴巴iconfont图标,并引用到vant的方法(没有之一)
  8. C4D+ PS打造城市场景 Create a Cityscape with Cinema 4D + Photoshop
  9. 基于持久内存的 单机上亿(128B)QPS -- 持久化 k/v 存储引擎
  10. Rocksdb 的优秀代码(三)-- 工业级 线程池实现分享