读书笔记三:2.1 把类编译成托管模块

把类编译成托管模块

1.  如何将编写好的类(源代码)编译成CLR可以执行的程序集呢,第一个步骤就是要把这些类编译成托管模块;

     editplus中编写源代码;

    

public class HiCSharp

 {

       public static void Main()

       {

              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

                      微软为我们提供一个默认的CSCRsp

                   一般目录位于%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老师 和周靖老师。努力。

posted @ 2011-11-29 13:30  fox_ice  阅读(249)  评论(0)    收藏  举报