1. 两个代码优化选项
托管代码的两个优化选项将方法的首次编译开销保持在最低限度,并且JIT编译器能判别CPU的指令集,并生成相应本地代码利用能提升程序性能的特殊指令,相对非托管代码(eg:C++是针对一种具体CPU【平台】编译的,一旦调用,代码直接就能执行)其效率相差不大,甚至因为一些特殊指令性能更好。
1) /optimize
影响IL代码的优化,优化后EXE/DLL文件更小,查看IL代码更易理解。
影响JIT本地代码的优化;
未优化的IL代码中包含许多NOP(no-operation,空操作)指令;还包含许多分支指令,它们用于跳到下一行代码。利用这些指令,VS可提供调试期间的“编辑并运行”(edit-and-continue)功能。另外,利用这些额外的指令,还可以在控制流程指令(比如for,while,do,if,else,try,catch和finally语句块)上设置断电,使代码更容易调试(控制流程未被优化)。
2) /debug
影响JIT本地代码的优化;
只有指定/debug(+/full/pdbonly)开关编译器才会生成一个Program Database(PDB)文件。PDB文件帮助调试器查找局部变量并将指令映射到源代码。
/debug:full 编译器会帮你记录每一条IL指令所生成的本地代码。这样可利用VS的JIT调试器功能,将一个调试器连接到一个正在运行的进程,并方便地对源代码进行调试。
/debug:pdbonly 允许在调试器中启动程序时进行源代码调试。
编译器开关设置 |
IL代码质量 |
JIT本地代码质量 |
/optimize- /debug- |
未优化 |
有优化 |
/optimize- /debug(+/full/pdbonly) |
未优化 |
未优化 |
/optimize+ /debug(-/+/full/pdbonly) |
有优化 |
有优化 |
2. C#编译器选项
选项 |
缩写 |
用途 |
优化 |
||
/filealign |
|
指定输出文件中节的大小。 |
/optimize [+|-] |
/o |
启用/禁用优化。默认情况下,将禁用优化。指定 /optimize+ 以启用优化。 |
输出文件 |
||
/doc |
|
指定要将处理的文档注释写入到其中的 XML 文件。 |
/out |
|
指定输出文件。 如果不指定输出文件的名称: a) .exe 文件将从包含 Main 方法的源代码文件中获取其名称。 b) .dll 或 .netmodule 将从第一个源代码文件中获取其名称。 |
/pdb |
|
指定 .pdb 文件的文件名和位置。 当您指定 /debug (C# 编译器选项) 时,编译器将在创建输出文件(.exe 或 .dll)的同一目录下创建一个与输出文件同名的 .pdb 文件。 |
/platform |
|
指定输出平台。有效值包括“msil”、“x86”“ia64”和“amd64” a) “x86”, 将程序集编译为由与 x86 兼容的 32 位公共语言运行时运行。 b) “ia64”, Itanium 将程序集编译为由采用 Itanium 处理器的计算机上的 64 位公共语言运行时运行。 c) “amd64”, 将程序集编译为由支持 AMD64 或 EM64T 指令集的计算机上的 64 位公共语言运行时运行。 d) “msil”, anycpu(默认值)将程序集编译为在任意平台上运行,当您的应用程序需要这些程序集时,公共语言运行库将对它们进行编译。 |
/target |
/t |
使用下列四个选项之一指定输出文件的格式:/target:exe、/target:library、/target:module 或 /target:winexe 编译器每次编译只创建一个程序集清单。关于编译中所有文件的信息全放在程序集清单中。除用 /target:module 创建的文件之外,所有输出文件都可以包含程序集清单。 在命令行生成多个输出文件时,只能创建一个程序集清单,且必须放置在命令行上指定的第一个输出文件中。无论第一个输出文件是什么(/target:exe、/target:winexe、/target:library 或 /target:module),在同一编译中生成的任何其他输出文件都必须是模块 (/target:module)。 /target:exe 控制台用户界面(console user interface,CUI) /target:winexe 图形用户界面(graphical user interface,GUI) |
.NET Framework 程序集 |
||
/reference |
/r |
/reference:[alias=]filename /reference:filename 从包含程序集的文件中导入元数据。若要从多个文件导入,请为每个文件包括一个 /reference 选项。 注意:导入的文件必须包含一个清单 有时必须从一个程序集内部引用同一组件的两个不同版本。为此,请在【每个】文件的 /reference 开关上使用 alias 子选项,以区分两个文件。此别名将用作组件名称的限定符,并解析为其中一个文件中的组件。 |
/addmodule |
|
使用 /addmodule 从不包含程序集清单的输出文件导入元数据。若要导入多个文件,请用逗号或分号分隔文件名。 |
/delaysign [ + | - ] |
|
指示编译器添加公钥,但将此程序集保留为未签名状态。 如果需要完全签名的程序集,则使用 /delaysign-。如果只想将公钥放在程序集中,则使用 /delaysign+。默认值为 /delaysign-。 如果不与 /keyfile 或 /keycontainer 一起使用,/delaysign 选项将无效。 如果要求完全签名的程序集,编译器将对包含清单(程序集元数据)的文件进行散列处理,并用私钥对该散列数据进行签名。产生的数字签名存储在包含清单的文件中。当果程序集的签名延迟时,编译器将不会计算和存储签名,但会在文件中保留空间以便以后添加签名。 例如,使用 /delaysign+ 将允许测试人员把程序集放入全局缓存中。测试完成后,可以通过使用程序集链接器实用工具将私钥放入程序集中对程序集进行完全签名。 |
/keycontainer |
|
指定加密密钥容器的名称。 使用 /keycontainer 选项时,通过将来自所指定容器的公钥插入到程序集清单中并且用私钥签名最终程序集,编译器可创建可共享的组件。若要生成密钥文件,请在命令行上键入 sn -k file。sn -i 将密钥对安装到容器中。 |
/keyfile |
|
指定包含加密密钥的文件名。 使用此选项时,编译器将从指定的文件将公钥插入程序集清单中,然后使用私钥对最终程序集进行签名。若要生成密钥文件,请在命令行上键入 sn -k file。 如果在相同的编译中指定了 /keyfile 和 /keycontainer(通过命令行选项或自定义特性),编译器将首先尝试密钥容器。如果成功,则使用密钥容器中的信息对程序集进行签名。如果编译器没有找到密钥容器,则将尝试用 /keyfile 指定的文件。如果成功,则使用密钥文件中的信息对程序集进行签名,并且将把密钥信息安装到密钥容器中(类似 sn -i),这样,下次编译时密钥容器将是有效的。 请注意,密钥文件可能只包含公钥。 |
/lib |
|
指定通过 /reference 引用的程序集的位置。 格式:/lib:dir1[,dir2] 编译器按以下顺序搜索未完全限定的程序集引用: 1) 当前工作目录。该目录为从其调用编译器的目录。 2) 公共语言运行时系统目录。 3) 由 /lib 指定的目录。(前两种未找到引用程序集时才搜索/lib所指定的路径) 4) 由 LIB 环境变量指定的目录。 |
/nostdlib [ + | - ] |
|
C#编译器会自动引用MSCorLob.dll程序集。指示编译器不导入标准库 (mscorlib.dll)。 |
调试/错误检查 |
||
/bugreport |
|
创建一个文件,该文件包含有助于报告 bug 的信息。 指定应将下面的信息放在 file 中: 1) 编译中所有源代码文件的副本。 2) 编译中使用的编译器选项列表。 3) 有关编译器、运行时和操作系统的版本信息。 4) 引用的程序集和模块(保存为十六进制数),.NET Framework 和 SDK 附带的程序集除外。 5) 编译器输出(如果有)。 6) 将会提示给您的问题的说明。 7) 关于考虑问题应如何解决(就此将会向您提示)的说明。 注意,生成文件的内容会公开源代码,可能导致意外的信息泄露。 |
/checked |
|
如果不在 checked 或 unchecked 关键字范围内的整数算法语句产生的值超出数据类型范围,并且编译中使用了 /checked+ (/checked),则该语句将在运行时导致异常。如果编译中使用的是 /checked- (默认值),则该语句在运行时不会导致异常。 checked 或 unchecked 关键字范围内的整数算法语句不受 /checked 选项的影响。 |
/debug |
|
指示编译器发出调试信息。 如果使用 /debug:full,请注意 /debug:full 可能会对 JIT 优化代码的速度和大小有一些影响,并且可能会稍微影响代码质量。我们建议在生成发布代码时使用 /debug:pdbonly 或不使用 PDB。 /debug[+ | -] /debug:{full | pdbonly} + | - 指定 + 或只指定 /debug 将使编译器生成调试信息,并将这些信息放置在一个程序数据库(.pdb 文件)中。指定 -(在不指定 /debug 时有效)将导致不创建任何调试信息。 full | pdbonly 指定编译器生成的调试信息类型。full 参数允许将调试器附加到正在运行的程序。指定 pdbonly 允许在调试器中启动程序时进行源代码调试,但仅在正在运行的程序附加到调试器时才显示汇编程序。 |
/errorreport |
|
使用此选项可以方便地向 Microsoft 报告 C# 内部编译器错误。 当编译器无法处理源代码文件时,将导致内部编译器错误 (ICE)。当发生 ICE 时,编译器不生成输出文件或可用来修复代码的任何有用的诊断。 |
/fullpaths |
|
默认情况下,编译所产生的错误和警告指定包含错误的文件名。/fullpaths 选项使编译器指定文件的完整路径。 |
/nowarn |
|
允许您禁止编译器显示一个或多个警告。用逗号分隔多个警告编号。 /nowarn:number1[,number2,...] 只应指定警告标识符的数值部分。例如,若要取消 CS0028,可以指定 /nowarn:28。 |
/warn |
|
指定您希望编译器显示的警告等级。(较小的数字只显示高严重度的警告;数字越大,显示的警告越多。有效值为 0 到 4) |
/warnaserror |
|
选项将所有警告都视为错误 /warnaserror[+ | -][:warning-list] 默认情况下启用 /warnaserror-,这导致警告不会妨碍生成输出文件。/warnaserror 与 /warnaserror+ 相同,它使警告被视为错误。 (可选)如果您希望只将几个特定的警告视为错误,可以指定一个以逗号分隔的列表,其中列出被视为错误的警告编号。 |
预处理器 |
||
/define |
/d |
定义预处理器符号。 /define:name[;name2] 使用 /define 选项与使用 #define 预处理器指令具有相同的效果,不同点在于编译器选项对项目中的所有文件都有效。在源文件中的 #undef 指令移除定义之前,符号在源文件中始终保持已定义状态。使用 /define 选项时,一个文件中的 #undef 指令不会影响到项目中的其他源代码文件。 |
资源 |
||
/link |
/l |
嵌入制定的互操作程序集COM文件中的元数据。程序集文件名的逗号分隔列表。如果文件名包含空格,则将该文件名置于引号中。 /link 选项仅嵌入接口、结构和委托。不支持嵌入 COM 类。 与 /reference 编译器选项类似,/link 编译器选项使用 Csc.rsp 响应文件,该文件引用经常用到的 .NET Framework 程序集。如果希望编译器不要使用 Csc.rsp 文件,请使用 /noconfig 编译器选项。 通过 /link 选项,可以部署包含嵌入类型信息的应用程序。这样,该应用程序无需引用运行时程序集,就可以使用运行时程序集中实现嵌入类型信息的类型。如果发布了各种版本的运行时程序集,则包含嵌入类型信息的应用程序可以使用各种版本,而不必重新编译。 |
/linkresource |
/linkres |
在输出文件中创建指向 .NET Framework 资源的链接。该资源文件未添加到输出文件中。这与 /resource 选项不同,后者会将资源文件嵌入到输出文件中。 |
/resource |
/res |
将一个 .NET Framework 资源嵌入到输出文件中。 |
/win32icon |
|
指定插入到输出文件中的 .ico 文件。 |
/win32res |
|
指定插入到输出文件中的 Win32 资源。 Win32 资源可以包含版本或位图(图标)信息,这些信息有助于在 Windows 资源管理器中标识您的应用程序。如果不指定 /win32res,编译器将根据程序集版本生成版本信息。 |
/win32manifest |
|
制定Win32清单文件(.xml) |
杂项 |
||
@ |
|
指定包含编译器选项和要编译的源代码文件的文件(响应文件----*.rsp)。 在响应文件中,多个编译器选项和源代码文件可以出现在同一行中。单个编译器选项的指定必须出现在同一行中(不能跨行)。响应文件可以带有以 # 符号开始的注释。 |
/baseaddress |
|
指定加载 DLL 的首选基址。 可以将该地址指定为十进制、十六进制或八进制数。 请注意:该地址中低位的数将会被舍入。例如,如果指定 0x11110001,它将被舍入为 0x11110000。 |
/codepage |
|
指定要用于编译中所有源代码文件的代码页。 |
/langversion |
|
指定要使用的语言版本。 |
/main |
|
如果有多个类包含 Main 方法,此选项指定包含程序入口点的类。 |
/noconfig |
|
编译器会自动查找两个名为CSC.rsp的响应文件,该选项指示编译器不使用 csc.rsp 进行编译。 csc.rsp 文件引用 .NET Framework 附带的所有程序集。 可以修改 csc.rsp 文件并指定其他编译器选项,而这些选项是那些应该包括在使用 csc.exe 的来自命令行的每次编译中的选项(/noconfig 选项除外)。 编译器会保留上次传递给 csc 命令的选项。因此,命令行上的任何选项都会【重写】 csc.rsp 文件中同一选项的设置。 如果不希望编译器查找并使用 csc.rsp 文件中的设置,请指定 /noconfig。 |
/recurse |
|
使您可以编译指定目录 (dir) 或项目目录的所有子目录中的源代码文件。 |
/unsafe |
|
允许对使用 unsafe 关键字的代码进行编译。 |
/utf8output |
|
使用 UTF-8 编码显示编译器输出。 |
/appconfig |
|
使 C# 应用程序能够在程序集绑定时向公共语言运行时 (CLR) 指明程序集应用程序配置 (app.config) 文件的位置。 |
参考资料:
(MSDN)C# 编译器选项