一、简介
DLL: dynamic link library 动态链接库,它是作为共享函数库的可执行文件,使用它可达到很高的代码重用效果。
打开VS2010 -> Visual Stdio Tools -> VS命令提示,使用命令 csc /? 查看是否有csc命令。
csc命令格式: csc 选项 *.cs
选项介绍:
/out:输出文件名
/target:library
/reference: dll文件名
二、举例
建立两个文件,MySwap.cs(对两个参数交换他们的值)和MyMaxCD.cs(求两个参数的最大公约数)。
1 using System; 2 3 namespace MyMethods 4 { 5 public class SwapClass 6 { 7 public static bool Swap(ref long i, ref long j) 8 { 9 i=i+j; 10 j=i-j; 11 i=i-j; 12 return true; 13 } 14 } 15 }
1 using System; 2 3 namespace MyMethods 4 { 5 public class MaxCDClass 6 { 7 public static long MaxCD(long i,long j) 8 { 9 long a,b,temp; 10 if(i>j) 11 { 12 a=i; 13 b=j; 14 } 15 else 16 { 17 b=i; 18 a=j; 19 } 20 temp=a%b; 21 while(temp!=0) 22 { 23 a=b; 24 b=temp; 25 temp=a%b; 26 } 27 return b; 28 } 29 } 30 }
然后使用如下命令编译生成dll文件
csc /target:library /out:MyDLL.DLL MySwap.cs MyMaxCD.cs
可看到生成的dll文件MyDLL.DLL
三、测试
建立如下文件MyClient.cs
1 using System; 2 using MyMethods; 3 4 class MyClient 5 { 6 public static void Main(string[] args) 7 { 8 if(args.Length !=2) 9 { 10 Console.WriteLine("Usage: MyClient <num1> <num2>"); 11 return; 12 } 13 long num1 = long.Parse(args[0]); 14 long num2 = long.Parse(args[1]); 15 SwapClass.Swap(ref num1,ref num2); 16 17 // 注意文件开头的using指令 18 Console.WriteLine("The result of swap is num1 = {0} and num2 ={1}",num1,num2); 19 long maxcd = MaxCDClass.MaxCD(num1,num2); 20 Console.WriteLine("The MaxCD of {0} and {1} is {2}",num1,num2,maxcd); 21 } 22 }
使用如下命令生成exe文件
csc /reference:MyDLL.DLL /out:MyClient.exe MyClient.cs
运行程序:MyClient 123 456
输出结果:
The result of swap is num1 = 456 and num2 = 123
The MaxCD of 456 and 123 is 3
四、动态链接库优缺点
1、节省内存和减少交换操作。 很多进程可以同时使用一个 DLL,在内存中共享该 DLL 的一个副本。相反,对于每个用静态链接库生成的应用程序,Windows 必须在内存中加载库代码的一个副本。
2、节省磁盘空间。许多应用程序可在磁盘上共享 DLL 的一个副本。相反,每个用静态链接库生成的应用程序均具有作为单独的副本链接到其可执行图像中的代码。
3、升级到 DLL 更为容易。DLL 中的函数更改时,只要函数的参数和返回值没有更改,就不需重新编译或重新链接使用它们的应用程序。相反,静态链接的对象代码要求在函数更改时重新链接应用程序。
4、提供售后支持。例如,可修改显示器驱动程序 DLL 以支持当初交付应用程序时不可用的显示器。
5、支持多语言程序。只要程序遵循函数的调用约定,用不同编程语言编写的程序就可以调用相同的 DLL 函数。程序与 DLL 函数在下列方面必须是兼容的:函数期望其参数被推送到堆栈上的顺序,是函数还是应用程序负责清理堆栈,以及寄存器中是否传递了任何参数。
6、提供了扩展 MFC 库类的机制。可以从现有 MFC 类派生类,并将它们放到 MFC 扩展 DLL 中供 MFC 应用程序使用。
7、使国际版本的创建轻松完成。通过将资源放到 DLL 中,创建应用程序的国际版本变得容易得多。可将用于应用程序的每个语言版本的字符串放到单独的 DLL 资源文件中,并使不同的语言版本加载合适的资源。
使用 DLL 的一个潜在缺点是应用程序不是独立的;它取决于是否存在单独的 DLL 模块。