读书笔记三:2.1 把类编译成托管模块
把类编译成托管模块
1. 如何将编写好的类(源代码)编译成CLR可以执行的程序集呢,第一个步骤就是要把这些类编译成托管模块;
① 在editplus中编写源代码;
|
public class HiCSharp { public static void { System.Console.WriteLine("Hi C Sharp"); } } |
② 把这类编译成模块,可以用CSC.exe命令开关 CSC.exe在 %SystemRoot%\MicroSoft.net\FrameWork\v.x.x.x(版本号) 里面;一般安装vs的时候都会在环境变量里面去设置;所以在命令提示符下可以直接用这个程序;
编译语法:
|
CSC.EXE /out:CSharp.exe /:t exe /r:Mocorlib.dll HICSharp.cs; |
查看同一个目录里面则会生出CSharp.exe一个PE文件;
/out 命令行开关表示要输出的程序集名称;
/t (Type) 程序集的类型 (EXE类型的);
/r (Reference) 引用的程序集;
MSCorlib.dll 是一个特殊的文件他包含了int byte等一些基本类型的定义;因为此类型调用的是非常频繁;所以如果省略 /r:MSCorlib.dll 编译器会自动把 这个命令开关 加上;也就是说 这个命令开关时默认的,不需要特殊指定 。
同样/out /t 也是有默认的选项.对于命令行程序默认的就是EXE;
可以直接用下面的命令简化:
|
CSC HICSharp.cs |
还可以生成 dll 文件具体语法是:
|
CSC.exe /out:HICharp.dll /t:library /r:MSCorlib.dll HICSharp.cs |
这个语法可以简化成
|
CSC /t:library HICSharp.cs |
最终在目录里面会生成一个 HiCSharp.dll的文件;
注意到默认情况下会生成EXE 可执行程序 通过 /t开关我们可以生成DLL 文件,我们可以把这个文件用 /t:winexe 开关,试着生成一下:用/t:winexe 不能运行;当然了因为他并没有winform类似的入口程序;它只是一个命令行程序。
③ 响应文件(Response File)
响应文件时一个由RSP 为后缀名的文件,在这个文件中我们可以把命令行开关写到这个文件里面,比如要在很多地方用到 /t:library这个命令开关 我们可以把它写到一个文件里面 在命令提示符下用@指定这个文件则每次生成只需要调用这个文件就可以了;
例如:HiCSharp.rsp;源代码是:
|
/out:HICSharp.dll /t:library /r:MSCorlib.dll |
我用命令提示符编译
CSC @HiCSharp.rsp HICSharp.cs 这样的话与之前我们编译的DLL 是有同样的功能,但是如果我们写到一个文件里面;我么可以重复调用;就不用每次都要写上 /t:library 了 因为library不是默认的。
有个注意的问题是在我们编译HICSharp.cs的时候 编译器会自动查找两个CSC.RSP 文件;
第一个查找的位置是和在当前目录中查找CSC.RSP ;
另外一个目录则是CSC.exe的目录里面查找CSC.RSP
微软为我们提供一个默认的CSC。Rsp
一般目录位于%SystemRott% Microsoft.NET\Framework\Vx.x.x 里面
# This file contains command-line options that the C#
# command line compiler (CSC) will process as part
# of every compilation, unless the "/noconfig" option
# is specified.
# Reference the common Framework libraries
/r:Accessibility.dll
/r:Microsoft.CSharp.dll
/r:System.Configuration.dll
/r:System.Configuration.Install.dll
/r:System.Core.dll
/r:System.Data.dll
/r:System.Data.DataSetExtensions.dll
/r:System.Data.Linq.dll
/r:System.Data.OracleClient.dll
/r:System.Deployment.dll
/r:System.Design.dll
/r:System.DirectoryServices.dll
/r:System.dll
/r:System.Drawing.Design.dll
/r:System.Drawing.dll
/r:System.EnterpriseServices.dll
/r:System.Management.dll
/r:System.Messaging.dll
/r:System.Runtime.Remoting.dll
/r:System.Runtime.Serialization.dll
/r:System.Runtime.Serialization.Formatters.Soap.dll
/r:System.Security.dll
/r:System.ServiceModel.dll
/r:System.ServiceModel.Web.dll
/r:System.ServiceProcess.dll
/r:System.Transactions.dll
/r:System.Web.dll
/r:System.Web.Extensions.Design.dll
/r:System.Web.Extensions.dll
/r:System.Web.Mobile.dll
/r:System.Web.RegularExpressions.dll
/r:System.Web.Services.dll
/r:System.Windows.Forms.Dll
/r:System.Workflow.Activities.dll
/r:System.Workflow.ComponentModel.dll
/r:System.Workflow.Runtime.dll
/r:System.Xml.dll
/r:System.Xml.Linq.dll
我们可以利用 /Noconfig 命令行开关 忽略 局部和全局的csc.rsp (我试了一下 还是可以编译,求解),还有就是/Noconfig 不能再响应文件里面写入,必须在命令提示符里面写;
继续努力吧,今天就写到这好累,坚持写读书笔记;
--------如果不认真读书,就是对作者的侮辱。
我不能侮辱 JEFF老师 和周靖老师。努力。

浙公网安备 33010602011771号