一、写在前面
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 MyMaxCDClass
{
public static long MyMaxCD(long i, long j)
{
long a, b, temp;
if (i < j)
{
a = i;
b = j;
}
else
{
a = j;
b = i;
}
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(有版本区别,1.0,2.0,3.0,3.5,4.0等)。
先将所需要的文件移到同一个文件夹内,运行: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;
//这里我们引用刚才定义的名称空间,如果刚才的两个文件我们写在两个不同的名称空间
namespace MyClient
{
class MyClient
{
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);
Console.WriteLine("The result of swap is num1 = {0},num2 = {1}", num1, num2);
long MaxCD = MyMaxCDClass.MyMaxCD(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 文件。
五、执行
一般要运行时,找出MyClient.exe所在文件夹,右击打开命令行窗口,选择要运行程序,即输入 EXE 文件的名称,文件名的后面跟两个数字,例如:
MyClient 123 456
六、输出
The result of swap is num1 = 456 and num2 = 123
The MaxCD of 456 and 123 is 3
七、反思
在做DLL文件时先可以不急于封装DLL动态链接库,而是运用类库中的类文件,等到条件成熟,再将类库中的类文件转换成为动态链接库,再右击资源管理器中的引用,引用动态链接库即可。