C#生成DLL文件的方法小结
使用csc命令将.cs文件编译成.dll的过程
很多时候,我们需要将.cs文件单独编译成.dll文件,操作如下:
打开命令窗口->输入cmd到控制台->cdC:\WINDOWS\Microsoft.NET\Framework\v1.1.4322
转到vs.net安装的该目录下->执行csc命令csc/target:libraryFile.cs->在该目录下产生一个对应名字的.dll文件(前提:把.cs文件放到C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322目录下)
csc命令的方式很多,请参考以下
译File.cs以产生File.exe
cscFile.cs编译File.cs以产生File.dll
csc/target:libraryFile.cs编译File.cs并创建My.exe
csc/out:My.exeFile.cs通过使用优化和定义DEBUG符号,编译当前目录中所有的C#文件。输出为File2.exe
csc/define:DEBUG/optimize/out:File2.exe*.cs编译当前目录中所有的C#文件,以产生File2.dll的调试版本。不显示任何徽标和警告
csc/target:library/out:File2.dll/warn:0/nologo/debug*.cs将当前目录中所有的C#文件编译为Something.xyz(一个DLL)
csc/target:library/out:Something.xyz*.cs编译File.cs以产生File.dll
csc/target:libraryFile.cs这个就是我们使用最多的一个命令,其实可以简单的写成csc/t:libraryFile.cs,另外的一个写法是csc/out:mycodebehind.dll/t:librarymycodebehind.cs,这个可以自己指定输出的文件名。
csc/out:mycodebehind.dll/t:librarymycodebehind.csmycodebehind2.cs,这个的作用是把两个cs文件装到一个.dll文件里
csc不是内部或外部命令,也不是可运行的程序解决方法
针对VisualStudio2005
1:右键点击"我的电脑"--"属性"--"高级"--"环境变量"--"系统变量"
将PATH中加上路径:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
2:直接在dos环境的cs相应文件夹目录执行
Path=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
3:VisualStudio2005命令提示
开始--》程序---》MicrosoftVisualStudio2005---->VisualStudioTools--->VisualStudio2005命令提示
把cs文件copy到C:\ProgramFiles\MicrosoftVisualStudio8\VC\
4:C:\autoexec.bat
加入:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
vs2008下
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\里的CSC.EXE是2.0版本
编译的.cs文件如果带usingSystem.Linq;编译通不过,如果不用LINQ语法删除usingSystem.Linq;即可,否则调用C:\WINDOWS\Microsoft.NET\Framework\v3.5里的CSC.EXE
同一SLN下里面class直接访问类库。
封装到DLL。导入DLL添加usingnamespace工有才能访问。
一、动态链接库
什么是动态链接库?DLL三个字母对于你来说一定很熟悉吧,它是DynamicLinkLibrary的缩写形式,动态链接库(DLL)是作为共享函数库的可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个DLL中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL副本的内容。
和大多数程序员一样,你一定很使用过DLL吧。也曾感受到它的带给你程序设计和编码上的好错吧今天我想和大家探讨一个主题:如何在C#创建和调用DLL(动态链接库),其实在很大意义上而讲,DLL让我更灵活的组织编写我们的应用程序,作为软件设计者,可一个根据它来达到很高的代码重用效果。下面我来介绍一下在C#中如何创建和调用DLL。
二、准备工作
我们需要对我们接下来要做的事情做个简单的介绍,在本文我们将利用C#语言创建一个名为MyDLL.DLL的动态链接库,在这个动态链接库文件中我们将提供两个功能一个是对两个参数交换他们的值,另一个功能是求两个参数的最大公约数。然后创建一个应用程序使用这个DLL。运行并输出结果。
三、创建DLL
让我们创建以下三个C#代码文件:
1、MySwap.cs
usingSystem; namespaceMyMethods { publicclassSwapClass { publicstaticboolSwap(reflongi,reflongj) { i=i+j; j=i-j; i=i-j; returntrue; } } }
2、MyMaxCD.cs
usingSystem; namespaceMyMethods { publicclassMaxCDClass { publicstaticlongMaxCD(longi,longj) { longa,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; } returnb; } } }
需要注意的是:我们在制作这两个文件的时候可以用VisualStudio.NET或者其他的文本编辑器,就算是记事本也可以。这两个文件虽然不在同一个文件里面,但是他们是属于同一个namespace(名称空间)这对以后我们使用这两个方法提供了方便。当然他们也可以属于不同的名称空间,这是完全可以的,但只是在我们应用他们的时候就需要引用两个不同的名称空间,所以作者建议还是写在一个名称空间下面比较好。
接下来的任务是把这两个cs文件变成我们需要的DLL文件。方法是这样的:在安装了Microsoft.NETFramework的操作系统上,我们可以在Windows所在目录下找到Microsoft.NET目录。在这个目录下面提供了C#的编译器,CSC.EXE运行:csc/target:library/out:MyDLL.DLLMySwap.csMyMaxCD.cs,完成后可在本目录下面找到我们刚才生成的MyDLL.DLL文件/target:library编译器选项通知编译器输出DLL文件而不是EXE文件。后跟文件名的/out编译器选项用于指定DLL文件名。如果/out后面不跟文件名编译器使用第一个文件(MySwap.cs)作为DLL文件名。生成的文件为MySwap.DLL文件。
OK!我们创建动态链接库文件的任务完成了,现在是我们享受劳动成果的时候了,下面我将介绍如何使用我们所创建的动态链接库文件。四、使用DLL我们简单写一个小程序来测试一下我们刚才写的两个方法是否正确,好吧,跟我来:
MyClient.cs
usingSystem; usingMyMethods;//这里我们引用刚才定义的名称空间,如果刚才的两个文件我们写在两个不同的名称空间 classMyClient { publicstaticvoidMain(string[]args) { if(args.Length!=2) { Console.WriteLine("Usage:MyClient<num1><num2>"); return; } longnum1=long.Parse(args[0]); longnum2=long.Parse(args[1]); SwapClass.Swap(refnum1,refnum2); //请注意,文件开头的using指令使您得以在编译时使用未限定的类名来引用DLL方法 Console.WriteLine("Theresultofswapisnum1={0}andnum2={1}",num1,num2); longmaxcd=MaxCDClass.MaxCD(num1,num2); Console.WriteLine("TheMaxCDof{0}and{1}is{2}",num1,num2,maxcd); } }
若要生成可执行文件MyClient.exe,请使用以下命令行:
csc/out:MyClient.exe/reference:MyLibrary.DLLMyClient.cs
/out编译器选项通知编译器输出EXE文件并且指定输出文件名(MyClient.exe)。/reference编译器选项指定该程序所引用的DLL文件。
五、执行
若要运行程序,请输入EXE文件的名称,文件名的后面跟两个数字,例如:MyClient123456
六、输出
Theresultofswapisnum1=456andnum2=123
TheMaxCDof456and123is3
七、小结
动态链接具有下列优点:
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模块