使⽤.NET命令⾏编译器编译项⽬(如ASP.NET、C#等)
源程序最好有.csproj或.vbproj⽂件,没有的话,要花些时间调试
下⾯我以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 >
csc的使⽤⽅法就靠你⾃⼰去琢磨了。这样编译出来的跟vs是有1点区别的,因为我们很多选项没有配置,但是经过测试,基本可以正常⼯作的。
-------------------------------------------------------------------------------------------------------
使⽤ C# 2.0 命令⾏编译器
摘要:本⽂分析了使⽤ C# 命令⾏编译器 ⽣成应⽤程序的过程。同时,还将向读者介绍很多为 C# 2.0 独有的编译器选项,例如,extended/reference 标志和强名称⽀持。阅读完本⽂的内容之后,您将能够轻松地在没有向导的环境中⽣成单⽂件程序集和多⽂件程序集。
适⽤于:
Microsoft Visual C# 2.0
注本⽂假定您熟悉 C# 编程语⾔和 .NET Framework 的结构。体验⼀下使⽤命令⾏⼯具的感觉还将证明很有帮助。
下载 CSCSample.msi ⽂件。
< 带来的乐趣
⼏乎没有⼈会否认集成开发环境 (IDE)(例如,Visual Studio 2005 和 Visual C# Express 2005)所提供的能使编程⼯作变得相当简单的诸多功能。但是,实际上 IDE ⾃⼰通常不能提供对基础编译器的所有⽅⾯的访问。例如,Visual Studio 2005 不⽀持⽣成多⽂件程序集。
此外,了解在命令⾏编译代码的过程,对于具有以下特征的⽤户可能有⽤:
偏爱最简单的⽣成 .NET Framework 应⽤程序的⽅法。
希望揭开 IDE 处理源代码⽂件的⽅法的秘密。
希望利⽤ .NET ⽣成实⽤⼯具,例如,nant或msbuild。
没有集成开发环境,例如,Visual Studio(但实际上具有免费提供的.NET Framework SDK)。
正在基于 Unix的系统(在该系统中,命令⾏是必须使⽤的⼯具)上使⽤ .NET Framework,并且希望更好地了解Mono 和/或 Portable .NET ECMA 兼容 C# 编译器。
正在研究当前未集成到 Visual Studio 中的备选 .NET 编程语⾔。
只是希望扩展他们的 C# 编程语⾔知识。
如果您属于上⾯所述的这些⽤户,那么就忠实于⾃⼰的选择并继续读下去吧。
C# 编译器选项概览
C# 编译器 提供了⼤量⽤于对创建 .NET 程序集的⽅式进⾏控制的选项。站在⼀个较⾼层次来看,命令⾏选项属于下列⼋个类别之⼀(表 1)。
表 1. 提供的标记的类别
C# 编译器类别定义
输出⽂件⽤于控制所⽣成的程序集的格式、可选的 XML ⽂档⽂件和强名称信息的选项。
输⼊⽂件使⽤户可以指定输⼊⽂件和引⽤的程序集的选项。
资源⽤于将任何必需的资源(例如,图标和字符串表)嵌⼊到程序集中的选项。
代码⽣成这些选项控制调试符号的⽣成。
错误和警告控制编译器处理源代码错误/警告的⽅式。
语⾔启⽤/禁⽤ C# 语⾔功能(例如,不安全代码)以及条件编译符号的定义。
杂项该类别的最有趣的选项使您可以指定 响应⽂件。
⾼级该类别指定⼀些更加深奥并且通常不太重要的编译器选项。
注 1.0 和 1.1 版本的 C# 编译器中存在的 /incremental 标志现在已过时。
在阅读本⽂的过程中,您将了解每个编译器类别中存在的核⼼标志(最重要的词是核⼼)。对于⼤多数开发⽅案,可以安全地忽略 C# 编译器的很多⾼级选项。如果您需要有关本⽂未予讨论的 功能的详细信息,请尽管放⼼,您可以参阅Microsoft Visual Studio 2005 ⽂档帮助系统(只须从“Search”选项卡中搜索“”并深⼊查阅)。
注 MSDN ⽂档也会对您也很所帮助,因为它描述了如何在 Visual Studio(如果可⽤)内部设置 的特定选项。
配置环境变量
在使⽤任何 .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.40607
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin
注上⾯的列表指向我的当前 .NET 2.0 测试版的路径。您的路径可能因 Visual Studio 和/或 .NET SDK 的安装和版本的不同⽽略有不同,因此请确保执⾏完整性检查。
在更新 Path 变量之后,请⽴即关闭所有对话框和当前打开的任何 Console 窗⼝,以便提交设置。您现在应当能够从任何命令提⽰执⾏ 和其他 .NET ⼯具了。要进⾏测试,请输⼊以下命令:
csc -?
ildasm -?
如果您看到有⼤量信息显⽰出来,那么您就可以继续了。
返回页⾸
命令⾏基础知识
已经能够熟练地在命令⾏⼯作的⽤户在使⽤ 时不会有任何问题,因⽽可以跳到下⼀节。但是,如果您使⽤命令⾏的次数很有限,那么请让我说明⼀些基本的详细信息,以便进⾏必要的准备。
⾸先,可以使⽤反斜杠或单个短划线指定 的选项。其次,在 / 或 - 以及随后的标志之间具有额外的空格是⾮法的。因此,“-help”是完全正确,⽽“- help”就⾏不通了。为了加以说明,让我们使⽤ help 标志检查完整的命令⾏选项集:
csc –help
csc /help
如果⼀切正常,则您应当看到所有可能的标志,如图 1 所⽰。
图 1. 帮助标志
很多选项都提供了简写表⽰法,以便为您节省⼀些键⼊时间。假设 help 标志的简写表⽰法是 ?,则您可以如下所⽰列出 的选项:
csc –?
csc /?
很多选项都需要附加的修饰,例如,⽬录路径和⽂件名。这种性质的标志使⽤冒号将标志与它的修饰分隔开来。例
如,/reference 选项要求将 .NET 程序集的名称包括在程序集清单中:
csc /reference:MyLibrary.dll ...
其他标志在性质上是⼆元的,因为它们或者被启⽤ (+),或者被禁⽤ (-)。⼆元标志总是默认为它们的禁⽤状态,因此您通常只需要使⽤加号标记。例如,要将所有编译警告都视为错误,可以启⽤ warnaserror 标志:
csc /warnaserror+ ...
标志的顺序⽆关紧要,但是在指定输⼊⽂件集合之前,必须列出所有标志的集合。另外值得说明的是,在修饰和它的关联数据之间具有额外的空格是⾮法的。例如,请使⽤ /reference:MyLibrary.dll,⽽不要使⽤ /reference:MyLibrary.dll。
返回页⾸
⽤于指定输⼊和控制输出的选项
我们将要分析的第⼀组命令⾏选项⽤于指定编译器输⼊(表 2)和控制得到的输出(表 3)。请注意,下⾯的表还标记了特定于 C# 2.0 的选项和任何可⽤的简写表⽰法。
表 2. 的以输⼊为中⼼的选项
输⼊标志定义是否特定于 C# 2.0?
/recurse通知 编译位于项⽬的⼦⽬录结构中的 C# ⽂件。该标志⽀持通配符
语法。
/reference
(/r)⽤于指定要在当前编译中引⽤的外部程序集。否,但是 2.0 编译器提供了别名变体。asp查看源码配置ui
/addmodule⽤于指定要包括在多⽂件程序集中的模块。否表 3. 的以输出为中⼼的选项
输出标志定义是否特定于C# 2.0?
/out指定要⽣成的程序集的名称。如果省略该标志,则输出⽂件的名称基于初始输⼊⽂件的名称(对于 *.dll 程序集⽽⾔)或定义 Main() ⽅法的类的名称(对于 *.exe 程序集⽽⾔)。
否/target (/t)指定要创建的程序集的⽂件格式。否/doc⽤于⽣成 XML ⽂档⽂件。否/delaysign使您可以使⽤强名称的延迟签名⽣成程序集。是/keyfile指定⽤于对程序集进⾏强命名的 *.snk ⽂件的路径。是/keycontainer指定包含 *.snk ⽂件的容器的名称。是/platform指定必须存在以便承载程序集的 CPU(x86、Itanium、x64 或 anycpu)。默认为 anycpu。是
/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 代码库
为了说明使⽤ 的输⼊/输出选项的过程,我们将创建⼀个强命名的单⽂件程序集 (MyCodeLibr
ary.dll),以定义⼀个名为 SimpleType 的类类型。为了展⽰ /doc 选项的作⽤,我们还将⽣成⼀个 XML ⽂档⽂件。
⾸先,请在驱动器 C 上创建⼀个名为 MyCSharpCode 的新⽂件夹。在该⽂件夹中,创建⼀个名为 MyCodeLibrary 的⼦⽬录。使⽤您选择的⽂本编辑器( 就完全合乎需要)输⼊以下代码,并将该⽂件保存为刚刚创建的
C:\MyCSharpCode\MyCodeLibrary ⽬录中的 simpleType.cs。
// simpleType.cs
using 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.cs
using 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
正如您可能希望的那样, ⽀持通配符表⽰法。因⽽,要编译单个⽬录中的所有⽂件,请仅将 *.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 /l *.cs
这⾥,/recurse 已经⽤特定⼦⽬录的名称限定。要指定多个⼦⽬录,我们可以再次使⽤通配符语法。如果我们要将simpleType.cs ⽂件移到⼀个新的名为 Core 的⼦⽬录中,则我们可以⽤以下命令集编译所有⼦⽬录中的所有 C# ⽂件:
csc /t:library /out:MyCodeLibrary.dll /recurse:*.cs
在任何⼀种情况下,输出都是相同的。
使⽤ /doc ⽣成 XML ⽂档⽂件
SimpleType 类已经配备了各种 XML 元素。就像您很可能知道的那样,C# 编译器将使⽤这些带有三条斜杠的代码注释⽣成XML ⽂档⽂件。要告诉 创建这样的⽂件,必须提供 /doc 选项,并且⽤要⽣成的⽂件的名称修饰它:
csc /t:library /out:MyCodeLibrary.dll /recurse:*.cs /l
在应⽤程序⽬录中,您现在应当看到⼀个名为 l 的新⽂件。如果您打开该⽂件,则会发现您的类型以 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 实⽤⼯具的
–k 选项创建⼀个名为 myKeyPair.snk 的新密钥对。
sn -k myKeyPair.snk
要使⽤ 对 MyCodeLibrary.dll 进⾏强命名,请发出以下命令集:
csc /t:library /out:MyCodeLibrary.dll /recurse:*.cs /l /keyfile:C:\MyKeyPair\myKeypair.snk
要验证该程序集的确具有强名称,请使⽤安全实⽤⼯具 () 和 –s 选项显⽰强名称信息:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。