|
下面我以VB.NET做示例讲解一下:
从proj我们可以获取以下有用信息
Settings小节中有很多配置选项,对应一些编译器选项
<References>小节中是项目的引用,第3方类库最好用绝对路径
<Imports>小节中是要导入的一些命名空间
<Files>小节中有项目的所有文件,选取 BuildAction = "Compile"的文件
用vbc测试了一下,很容易,注意以下几项:
rootnamespace
reference
target
imports
加上bugreport可以将所有的源文件代码和bug报告输出。不错
给你一端编译示例:
vbc /r:System.dll /r:System.Data.dll /r:System.Drawing.dll /r:System.Web.dll /r:System.Xml.dll /r:bin/Microsoft.ApplicationBlocks.Data.dll /r:bin/ExportTechnologies.WebControls.RTE.dll /imports:Microsoft.VisualBasic /imports:System /imports:System.Collections /imports:System.Configuration /imports:System.Data /imports:System.Drawing /imports:System.Web /imports:System.Web.UI /imports:System.Web.UI.HtmlControls /imports:System.Web.UI.WebControls /imports:MMS /rootnamespace:MMS /t:library /out:Truly.MMS.dll /bugreport:bug.log AssemblyInfo.vb Global.asax.vb HDAdd.ASPx.vb HDticketLogAdd.ASPx.vb MIS.vb PageBase.vb Utils.vb
如果没有proj文件,那么可以用下面的命令获取:
dir /b *.vb > filelist.txt
csc的使用方法就靠你自己去琢磨了。这样编译出来的跟vs是有1点区别的,因为我们很多选项没有配置,但是经过测试,基本可以正常工作的。
-------------------------------------------------------------------------------------------------------
使用 C# 2.0 命令行编译器
http://msdn.microsoft.com/zh-cn/library/ms379563(vs.80).ASPx#mainSection
摘要:本文分析了使用 C# 命令行编译器 csc.exe 生成应用程序的过程。同时,还将向读者介绍很多为 C# 2.0 独有的编译器选项,例如,extended/reference 标志和强名称支持。阅读完本文的内容之后,您将能够轻松地在没有向导的环境中生成单文件程序集和多文件程序集。
适用于:
Microsoft Visual C# 2.0
注 本文假定您熟悉 C# 编程语言和 .NET Framework 的结构。体验一下使用命令行工具的感觉还将证明很有帮助。
下载 CSCSample.msi 文件。
scsc.exe 带来的乐趣
几乎没有人会否认集成开发环境 (IDE)(例如,Visual Studio 2005 和 Visual C# Express 2005)所提供的能使编程工作变得相当简单的诸多功能。但是,实际上 IDE 自己通常不能提供对基础编译器的所有方面的访问。例如,Visual Studio 2005 不支持生成多文件程序集。
此外,了解在命令行编译代码的过程,对于具有以下特征的用户可能有用:
希望揭开 IDE 处理源代码文件的方法的秘密。
希望利用 .NET 生成实用工具,例如,nant 或 msbuild。
没有集成开发环境,例如,Visual Studio(但实际上具有免费提供的 .NET Framework SDK)。
正在基于 Unix的系统(在该系统中,命令行是必须使用的工具)上使用 .NET Framework,并且希望更好地了解 Mono 和/或 Portable .NET ECMA 兼容 C# 编译器。
正在研究当前未集成到 Visual Studio 中的备选 .NET 编程语言。
只是希望扩展他们的 C# 编程语言知识。
如果您属于上面所述的这些用户,那么就忠实于自己的选择并继续读下去吧。
C# 编译器选项概览
C# 编译器 csc.exe 提供了大量用于对创建 .NET 程序集的方式进行控制的选项。站在一个较高层次来看,命令行选项属于下列八个类别之一(表 1)。
表 1. csc.exe 提供的标记的类别
C# 编译器类别 | 定义 |
---|---|
输出文件 | 用于控制所生成的程序集的格式、可选的 XML 文档文件和强名称信息的选项。 |
输入文件 | 使用户可以指定输入文件和引用的程序集的选项。 |
资源 | 用于将任何必需的资源(例如,图标和字符串表)嵌入到程序集中的选项。 |
代码生成 | 这些选项控制调试符号的生成。 |
错误和警告 | 控制编译器处理源代码错误/警告的方式。 |
语言 | 启用/禁用 C# 语言功能(例如,不安全代码)以及条件编译符号的定义。 |
杂项 | 该类别的最有趣的选项使您可以指定 csc.exe 响应文件。 |
高级 | 该类别指定一些更加深奥并且通常不太重要的编译器选项。 |
注 1.0 和 1.1 版本的 C# 编译器中存在的 /incremental 标志现在已过时。
在阅读本文的过程中,您将了解每个编译器类别中存在的核心 标志(最重要的词是核心)。对于大多数开发方案,可以安全地忽略 C# 编译器的很多高级选项。如果您需要有关本文未予讨论的 csc.exe 功能的详细信息,请尽管放心,您可以参阅 Microsoft Visual Studio 2005 文档帮助系统(只须从“Search”选项卡中搜索“csc.exe”并深入查阅)。
注 MSDN 文档也会对您也很所帮助,因为它描述了如何在 Visual Studio(如果可用)内部设置 csc.exe 的特定选项。
配置环境变量
在使用任何 .NET SDK 命令行工具(包括 C# 编译器)之前,需要配置开发计算机以识别它们的存在。最简单的方法是使用 Start | All Programs | Visual Studio 2005 | Visual Studio Tools 菜单选项,启动预配置的 Visual Studio 命令提示。这一特定的控制台能够自动初始化必要的环境变量,而无须您执行任何操作。(Visual Studio .NET 2003 用户需要启动他们各自的命令提示)。
注 如果您没有 Visual Studio,但是已经安装了 .NET Framework SDK,则可以从 Start | All Programs | Microsoft .NET Framework SDK 2.0 菜单选项启动预配置的命令提示。
如果您希望从任意的 命令提示使用 .NET 命令行工具,则需要手动更新计算机的 Path 变量。做法是,请右键单击桌面上的 My Computer 图标并选择 Properties 菜单选项。从出现的对话框中,单击位于 Advanced 选项卡下面的 Environment Variables 按钮。从出现的对话框中,在 System 变量列表框中的当前 Path 变量的结尾添加以下目录清单(请注意,必须用分号分隔各个条目):
C:/Windows/Microsoft.NET/Framework/v2.0.40607C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin
注 上面的列表指向我的当前 .NET 2.0 测试版的路径。您的路径可能因 Visual Studio 和/或 .NET SDK 的安装和版本的不同而略有不同,因此请确保执行完整性检查。
在更新 Path 变量之后,请立即关闭所有对话框和当前打开的任何 Console 窗口,以便提交设置。您现在应当能够从任何命令提示执行 csc.exe 和其他 .NET 工具了。要进行测试,请输入以下命令:
csc -?ildasm -?
如果您看到有大量信息显示出来,那么您就可以继续了。
返回页首命令行基础知识
已经能够熟练地在命令行工作的用户在使用 csc.exe 时不会有任何问题,因而可以跳到下一节。但是,如果您使用命令行的次数很有限,那么请让我说明一些基本的详细信息,以便进行必要的准备。
首先,可以使用反斜杠或单个短划线指定 csc.exe 的选项。其次,在 / 或 - 以及随后的标志之间具有额外的空格是非法 的。因此,“-help”是完全正确,而“- help”就行不通了。为了加以说明,让我们使用 help 标志检查完整的命令行选项集:
csc helpcsc /help
如果一切正常,则您应当看到所有可能的标志,如图 1 所示。
图 1. 帮助标志
很多选项都提供了简写表示法,以便为您节省一些键入时间。假设 help 标志的简写表示法是 ?,则您可以如下所示列出 csc.exe 的选项:
csc ?csc /?
很多选项都需要附加的修饰,例如,目录路径和文件名。这种性质的标志使用冒号将标志与它的修饰分隔开来。例如,/reference 选项要求将 .NET 程序集的名称包括在程序集清单中:
csc /reference:MyLibrary.dll ...
其他标志在性质上是二元 的,因为它们或者被启用 (+),或者被禁用 (-)。二元标志总是默认为它们的禁用状态,因此您通常只需要使用加号标记。例如,要将所有编译警告都视为错误,可以启用 warnaserror 标志:
csc /warnaserror+ ...
标志的顺序无关紧要,但是在指定输入文件集合之前,必须列出所有标志的集合。另外值得说明的是,在修饰和它的关联数据之间具有额外的空格是非法 的。例如,请使用 /reference:MyLibrary.dll,而不要使用 /reference:MyLibrary.dll。
返回页首用于指定输入和控制输出的选项
我们将要分析的第一组命令行选项用于指定编译器输入(表 2)和控制得到的输出(表 3)。请注意,下面的表还标记了特定于 C# 2.0 的选项和任何可用的简写表示法。
表 2. csc.exe 的以输入为中心的选项
输入标志 | 定义 | 是否特定于 C# 2.0? |
---|---|---|
/recurse | 通知 csc.exe 编译位于项目的子目录结构中的 C# 文件。该标志支持通配符语法。 | 否 |
/reference (/r) | 用于指定要在当前编译中引用的外部程序集。 | 否,但是 2.0 编译器提供了别名变体。 |
/addmodule | 用于指定要包括在多文件程序集中的模块。 | 否 |
表 3. csc.exe 的以输出为中心的选项
输出标志 | 定义 | 是否特定于 C# 2.0? |
---|---|---|
/out | 指定要生成的程序集的名称。如果省略该标志,则输出文件的名称基于初始输入文件的名称(对于 *.dll 程序集而言)或定义 Main() 方法的类的名称(对于 *.exe 程序集而言)。 | 否 |
/target (/t) | 指定要创建的程序集的文件格式。 | 否 |
/doc | 用于生成 XML 文档文件。 | 否 |
/delaysign | 使您可以使用强名称的延迟签名生成程序集。 | 是 |
/keyfile | 指定用于对程序集进行强命名的 *.snk 文件的路径。 | 是 |
/keycontainer | 指定包含 *.snk 文件的容器的名称。 | 是 |
/platform | 指定必须存在以便承载程序集的 CPU(x86、Itanium、x64 或 anycpu)。默认为 anycpu。 | 是 |
也许用途最多的输入/输出选项是 /target。该标志通过使用附加的修饰(表 4)告诉编译器您对生成哪个类型的 .NET 程序集感兴趣。
表 4. /target 标志的变体
目标修饰 | 定义 |
---|---|
/target:exe | 创建基于控制台的程序集。如果未指定 /target 选项,则这是默认选项。 |
/target:winexe | 创建基于 Windows 窗体的可执行程序集。尽管您可以使用 /target:exe 创建 Windows 窗体应用程序,但控制台窗口将在主窗体的后台隐现。 |
/target:library | 用于生成 .NET 代码库 (*.dll)。 |
/target:module | 创建将成为多文件程序集的一部分的模块。 |
编译 .NET 代码库
为了说明使用 csc.exe 的输入/输出选项的过程,我们将创建一个强命名的单文件程序集 (MyCodeLibrary.dll),以定义一个名为 SimpleType 的类类型。为了展示 /doc 选项的作用,我们还将生成一个 XML 文档文件。
首先,请在驱动器 C 上创建一个名为 MyCSharpCode 的新文件夹。在该文件夹中,创建一个名为 MyCodeLibrary 的子目录。使用您选择的文本编辑器(notepad.exe 就完全合乎需要)输入以下代码,并将该文件保存为刚刚创建的 C:/MyCSharpCode/MyCodeLibrary 目录中的 simpleType.cs。
// simpleType.csusing System;namespace MyCodeLibrary{ /// <summary> /// Simple utility type. /// </summary> public class SimpleType { /// <summary> /// Print out select environment information /// </summary> public static void DisplayEnvironment() { Console.WriteLine("Location of this program: {0}", Environment.CurrentDirectory); Console.WriteLine("Name of machine: {0}", Environment.MachineName); Console.WriteLine("OS of machine: {0}", Environment.OSVersion); Console.WriteLine("Version of .NET: {0}", Environment.Version); } }}
现在,打开命令提示,并且使用 cd(更改目录)命令导航到 simpleType.cs 文件的位置 (C:/MyCSharpCode/MyCodeLibrary):
cd MyCSharpCode/MyCodeLibrary
或
cd C:/MyCSharpCode/MyCodeLibrary
要将该源代码文件编译为名为 MyCodeLibrary.dll 的单文件程序集,请指定以下命令集:
csc /t:library /out:MyCodeLibrary.dll simpleType.cs
此时,您应当在应用程序目录中具有一个全新的 .NET 代码库,如图 2 所示。
图 2. 新的 .NET 代码库
当在命令行编译多个 C# 文件时,可以分别列出每个文件 ― 如果您希望编译包含在单个目录中的 C# 文件的子集,则这可能有所帮助。假设我们已经创建了另外一个名为 asmInfo.cs 的 C# 代码文件(保存在同一目录中),它定义了下列程序集级别属性以描述我们的代码库:
// asmInfo.csusing System;using System.Reflection;// A few assembly level attributes.[assembly:AssemblyVersion("1.0.0.0")][assembly:AssemblyDescription("Just an example library")][assembly:AssemblyCompany("Intertech Training")]
要只编译 simpleType.cs 和 asmInfo.cs 文件,请键入:
csc /t:library /out:MyCodeLibrary.dll simpleType.cs asmInfo.cs
正如您可能希望的那样,csc.exe 支持通配符表示法。因而,要编译单个目录中的所有文件,请仅将 *.cs 指定为输入选项:
csc /t:library /out:MyCodeLibrary.dll *.cs
使用 /recurse 指定子目录
在创建应用程序时,您肯定喜欢为您的项目创建逻辑目录结构。您可以通过将代码文件放到特定的子目录(/Core、/AsmInfo、/MenuSystem 等等)中对它们进行组织,而不是将多达 25 个文件转储到名为 myApp 的单个目录中。尽管我们的当前示例只包含几个文件,但假设您将 AsmInfo.cs 文件放到一个名为 /AsmInfo 的新的子目录(如图 3 所示)中。
图 3. 新的 /AsmInfo 子目录
要告诉 C# 编译器编译位于根目录以及 AsmInfo 子目录中的所有 C# 文件,请使用 /recurse 选项:
csc /t:library /out:MyCodeLibrary.dll /recurse:AsmInfo /doc:myDoc.xml *.cs
这里,/recurse 已经用特定子目录的名称限定。要指定多个子目录,我们可以再次使用通配符语法。如果我们要将 simpleType.cs 文件移到一个新的名为 Core 的子目录中,则我们可以用以下命令集编译所有子目录中的所有 C# 文件:
csc /t:library /out:MyCodeLibrary.dll /recurse:*.cs
在任何一种情况下,输出都是相同的。
使用 /doc 生成 XML 文档文件
SimpleType 类已经配备了各种 XML 元素。就像您很可能知道的那样,C# 编译器将使用这些带有三条斜杠的代码注释生成 XML 文档文件。要告诉 csc.exe 创建这样的文件,必须提供 /doc 选项,并且用要生成的文件的名称修饰它:
csc /t:library /out:MyCodeLibrary.dll /recurse:*.cs /doc:myDoc.xml
在应用程序目录中,您现在应当看到一个名为 myDoc.xml 的新文件。如果您打开该文件,则会发现您的类型以 XML 的形式进行了说明,如图 5 所示。
图 5. XML 形式的类型文档
注 如果您希望了解 C# XML 代码注释的详细信息,则请参阅文章 XML Comments Let You Build Documentation Directly From Your Visual Studio .NET Source Files。
使 用 /keyfile 建立强名称
当前示例的最后一项任务是为我们的程序集分配一个强名称。在 .NET 1.1 下,创建强命名程序集需要使用 [AssemblyKeyFile] 属性。尽管这样做就很好了,但 C# 2.0 编译器现在提供了 /keyfile 标志,以指定强名称密钥文件 (*.snk) 的位置。
在驱动器 C 上创建一个名为 MyKeyPair 的新文件夹,然后使用命令提示更改至该目录。接下来,使用 sn.exe 实用工具的 â