使用csc命令将cs文件编译成dll的过程
很多时候我们需要将cs文件单独编译成dll文件操作如下:
打开命令窗口>输入cmd到控制台>cdC:WINDOWSMicrosoftNETFrameworkv
转到vsnet安装的该目录下>执行csc命令csc/target:libraryFilecs>在该目录下产生一个对应名字的dll文件(前提:把cs文件放到C:WINDOWSMicrosoftNETFrameworkv目录下)
csc命令的方式很多请参考以下
译Filecs以产生Fileexe
cscFilecs编译Filecs以产生Filedll
csc/target:libraryFilecs编译Filecs并创建Myexe
csc/out:MyexeFilecs通过使用优化和定义DEBUG符号编译当前目录中所有的C#文件输出为Fileexe
csc/define:DEBUG/optimize/out:Fileexe*cs编译当前目录中所有的C#文件以产生Filedll的调试版本不显示任何徽标和警告
csc/target:library/out:Filedll/warn:/nologo/debug*cs将当前目录中所有的C#文件编译为Somethingxyz(一个DLL)
csc/target:library/out:Somethingxyz*cs编译Filecs以产生Filedll
csc/target:libraryFilecs这个就是我们使用最多的一个命令其实可以简单的写成csc/t:libraryFilecs另外的一个写法是csc/out:mycodebehinddll/t:librarymycodebehindcs这个可以自己指定输出的文件名
csc/out:mycodebehinddll/t:librarymycodebehindcsmycodebehindcs这个的作用是把两个cs文件装到一个dll文件里
举例(摘于网络)
一动态链接库
什么是动态链接库?DLL三个字母对于你来说一定很熟悉吧它是DynamicLinkLibrary的缩写形式动态链接库(DLL)是作为共享函数库的可执行文件动态链接提供了一种方法使进程可以调用不属于其可执行代码的函数函数的可执行代码位于一个DLL中该DLL包含一个或多个已被编译链接并与使用它们的进程分开存储的函数DLL还有助于共享数据和资源多个应用程序可同时访问内存中单个DLL副本的内容
和大多数程序员一样你一定很使用过DLL吧也曾感受到它的带给你程序设计和编码上的好错吧今天我想和大家探讨一个主题如何在C#创建和调用DLL(动态链接库)其实在很大意义上而讲DLL让我更灵活的组织编写我们的应用程序作为软件设计者可一个根据它来达到很高的代码重用效果下面我来介绍一下在C#中如何创建和调用DLL
二准备工作
我们需要对我们接下来要做的事情做个简单的介绍在本文我们将利用C#语言创建一个名为MyDLLDLL的动态链接库在这个动态链接库文件中我们将提供两个功能一个是对两个参数交换他们的值另一个功能是求两个参数的最大公约数然后创建一个应用程序使用这个DLL运行并输出结果
三创建DLL
让我们创建以下三个C#代码文件
MySwapcs
}
usingSystem;
namespaceMyMethods
{
publicclassSwapClass
{
publicstaticboolSwap(reflongireflongj)
{
i=i+j;
j=ij;
i=ij;
returntrue;
}
}
}
MyMaxCDcs
usingSystem;
namespaceMyMethods
{
publicclassMaxCDClass
{
publicstaticlongMaxCD(longilongj)
{
longabtemp;
if(i>j)
{
a=i;
b=j;
}
else
{
b=i;
a=j;
}
temp=a%b;
while(temp!=)
{
a=b;
b=temp;
temp=a%b;
}
returnb;
}
}
}
需要注意的是我们在制作这两个文件的时候可以用VisualStudioNET或者其他的文本编辑器就算是记事本也可以这两个文件虽然不在同一个文件里面但是他们是属于同一个namespace(名称空间)这对以后我们使用这两个方法提供了方便当然他们也可以属于不同的名称空间这是完全可以的但只是在我们应用他们的时候就需要引用两个不同的名称空间所以作者建议还是写在一个名称空间下面比较好
接下来的任务是把这两个cs文件变成我们需要的DLL文件方法是这样的在安装了MicrosoftNETFramework的操作系统上我们可以在Windows所在目录下找到MicrosoftNET目录在这个目录下面提供了C#的编译器CSCEXE运行csc/target:library/out:MyDLLDLLMySwapcsMyMaxCDcs完成后可在本目录下面找到我们刚才生成的MyDLLDLL文件/target:library编译器选项通知编译器输出DLL文件而不是EXE文件后跟文件名的/out编译器选项用于指定DLL文件名如果/out后面不跟文件名编译器使用第一个文件(MySwapcs)作为DLL文件名生成的文件为MySwapDLL文件
OK!我们创建动态链接库文件的任务完成了现在是我们享受劳动成果的时候了下面我将介绍如何使用我们所创建的动态链接库文件四使用DLL我们简单写一个小程序来测试一下我们刚才写的两个方法是否正确好吧跟我来
MyClientcs
usingSystem;
usingMyMethods;//这里我们引用刚才定义的名称空间如果刚才的两个文件我们写在两个不同的名称空间
classMyClient
{
publicstaticvoidMain(string[]args)
{
if(argsLength!=)
{
ConsoleWriteLine("Usage:MyClient<num><num>");
return;
}
longnum=longParse(args[]);
longnum=longParse(args[]);
SwapClassSwap(refnumrefnum);
//请注意文件开头的using指令使您得以在编译时使用未限定的类名来引用DLL方法
ConsoleWriteLine("Theresultofswapisnum={}andnum={}"numnum);
longmaxcd=MaxCDClassMaxCD(numnum);
ConsoleWriteLine("TheMaxCDof{}and{}is{}"numnummaxcd);
}
}
若要生成可执行文件MyClientexe请使用以下命令行
csc/out:MyClientexe/reference:MyDLLDLLMyClientcs
/out编译器选项通知编译器输出EXE文件并且指定输出文件名(MyClientexe)/reference编译器选项指定该程序所引用的DLL文件
五执行
若要运行程序请输入EXE文件的名称文件名的后面跟两个数字例如MyClient
六输出
Theresultofswapisnum=andnum=
TheMaxCDofandis
七小结
动态链接具有下列优点
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模块