• 1、编译 C# 类

    • 1.1、C# 编译工具
    • 1.2、编译一个 C# 类
    • 1.3、编译多个 C# 类
  • 2、编译 Java 类
    • 2.1、Java 编译工具
    • 2.2、编译 Java 类
  • 3、组合命令符
  • 4、总结
    • 4.1、学校里学的有没有用?
    • 4.2、本文总结
    • 4.3、本系列总结

1、编译 C# 类

1.1、C# 编译工具

csc.exe 是 Microsoft .NET Framework 中的 C# 编译器,它支持很多编译选项。在 cmd 中键入csc /help,然后回车即可看到所有的 Visual C# 编译器选项和说明。

csc.exe 中有 6 个带默认值的选项。其中/out:<文件>选项用于指定输出文件名,可指定多个文件名甚至可以用通配符,默认取包含主类(含 Main 方法的类)的文件或第一个文件的基名称(不含后缀);而/target:exe选项表示生成控制台可执行文件,即默认生成以 exe 为后缀的可执行文件,该选项可缩写为/t:exe

我通过百度大致的检索了一下,发现大量关于 csc 的报错问题居然是“csc 不是内部或外部命令……”。如果你看了本系列前面几篇博文,相信你一眼就能看出这显然不是一个有关 .NET 的问题,而是 Windows 的基础问题。所有在这儿我还是简单提一下,如果你恰好遇到这个问题,有如下两个办法:

  • 第一个,把你本机的 .NET 主目录加入到 path 环境变量中去,然后就可以通过 cmd 调用 csc 了。
  • 第二个,找到你本机安装的 Visual Studio 中提供的开发人员命令提示符工具(每个版本的 VS 都有提供,尽管路径不一样,但在开始菜单的 Visual Studio Tools 里面一般都能找到),它主要也就是提前帮你设置好了工具的执行路径。

1.2、编译一个 C# 类

第一步,将如下 C# 代码保存为D:\Workspace\SayHello.cs文件。

public class SayHello
{public static void Main(string[] args){System.Console.WriteLine("你好,C#");System.Console.ReadKey();}
}

第二步,在命令行中键入csc sayhello.cs后回车即可完成编译。如下图所示:

编译完成之后,你会发现 D:\Workspace 目录下多了一个 SayHello.exe 文件,双击它的效果如下:

至于编译生成的文件名为什么是 SayHello.exe,上一小节已经讲过了。这里要说的是,假如你想让它生成一个你指定名称的可执行文件,比如指定为 chinese.exe 的话,那么你需要键入csc /out:chinese.exe sayhello.cs命令并回车即可。

1.3、编译多个 C# 类

第一步,将如下 C# 代码保存为D:\Workspace\SayHello.cs文件。

public class SayHello
{public static void Main(string[] args){System.Console.WriteLine("你好,C#");Test.Try(); // 调用 Test 类中的 Try 方法System.Console.ReadKey();}
}

将如下 C# 代码保存为D:\Workspace\Test.cs文件。

public class Test
{public static void Try(){System.Console.WriteLine("Just a try!");}
}

第二步,在命令行中键入csc sayhello.cs test.cs后并回车,再次双击 SayHello.exe 文件,效果如下:

再补充几个命令:

  • csc /out:say.exe sayhello.cs test.cs表示将 sayhello.cs 和 test.cs 两个类文件编译成 say.exe 文件。
  • csc /out:sayall.exe *.cs表示将当前目录下的所有 C# 类文件编译成 sayall.exe 文件。
  • csc /utf8output *.cs表示将当前目录下的所有 C# 类文件按 UTF-8 编码来编译输出。
  • csc /target:library test.cs表示将 test.cs 类文件编译成 Test.dll 文件。
  • csc /target:library /out:say.dll *.cs表示将当前目录下的所有 C# 类文件编译成 say.dll 文件。

2、编译 Java 类

2.1、Java 编译工具

Java 的开发工具包是 JDK,在 JDK 中有用于编译 Java 的工具 javac.exe,还有用于运行 Java 的工具 java.exe 等。javac 和 java 都有很多选项,且它们都有一个默认的参数-help,这意味着如果你想了解它们全部的选项和说明,直接在 cmd 中键入工具名 javac 或 java 并回车即可。

事实上编译 Java 类比编译 C# 类要相对复杂一些。首先,javac.exe 会把 Java 代码编译成 class 文件,而不是可执行程序,这就意味着你还需要额外的工具(java.exe)来运行 Java 程序。其次,JDK 对编码格式的处理不太好,常需要手工指定。再次,在调用 class 文件的时候,你必须确保大小写完全一致,而且不能带 class 后缀,否则就会报错。

所以对初学者而言,通过命令行编译 Java 代码可能会遇到更多各种各样的问题。同样令人遗憾的是,网上关于“javac 不是内部或外部命令……”的问题也非常多,如果你遇到这个问题请仔细检查你本机的 JDK 是否安装成功,以及环境变量是否配置正确。

2.2、编译 Java 类

第一步,将如下 Java 代码保存为D:\Workspace\SayHello.java文件。

public class SayHello{public static void main(String[] args){System.out.println("你好,Java");}
}

第二步,在命令行中键入javac -encoding utf8 sayhello.java后回车即可完成编译。如下图所示:

上述命令中的-encoding参数理论上不是必须的,但实际上几乎就是必须的。因为 javac.exe 会根据当前操作系统的默认编码格式来转化程序代码(忽略文件编码格式)。众所周知 Windows 中默认编码是 ANSI,对应到中国就是 GBK,而大多数文本编辑器默认都是 UTF-8,所以如果你不指定-encoding参数的话编译时就会报“编码GBK的不可映射字符”的错误。

第三步,在命令行中键入java SayHello后回车,效果如下所示:

上述命令中一定要注意大小写一致的问题,而且不能带 class 后缀,否则就会报错。另外,编译多个 Java 类与编译多个 C# 类的思路完全一样,这里就不再赘述了。

3、组合命令符

在本系列前面几篇文章中已陆续出现了大部分命令行特殊字符。如:命令行回显屏蔽符 @、批处理变量引导符 %、转义字符 ^、通配符 *、字符串界定符 "(双引号)、命令界定符 '(单引号)、重定向符 > 和 >>、命令管道符 | 等。本节再来说说命令行中的三个组合命令符 &、&& 以及 ||。

如下脚本(当命令正确运行到此处时,将逐行依次输出 a、b、c):

if errorlevel==0 (echo aecho becho c
)

上述脚本还可以改写成:

if errorlevel==0 (echo a & echo b & echo c)

或:

if errorlevel==0 (echo a && echo b && echo c)

&的语法是:第一条命令 & 第二条命令 [& 第三条命令...],表达式中的所有命令都将被执行,即便前面的命令执行失败了,后面的命令也依旧会被执行。

&&的语法是:第一条命令 && 第二条命令 [&& 第三条命令...],表达式中的命令将依次被执行,如果遇到错误将不再执行后面的命令,只有执行一直不出错的情况下才会执行完所有命令。

如果把前面那个脚本改写成(则只会输出 a):

if errorlevel==0 (echo a || echo b || echo c)

||的语法是:第一条命令 || 第二条命令 [|| 第三条命令...],与 && 恰恰相反的是,仅当 || 前面的命令执行执行失败时才会执行后面的命令。如果第一条命令执行成功就只会执行第一条命令,当第一条命令执行失败后才会执行第二条命令,只有当前面的所有命令都执行失败时,才会执行到最后一条命令。

额外补充:本系列前几篇博文中多次出现echo.,它的作用是返回一个空行。需要注意的是 echo 和后面的点得紧挨着,中间不能有空格,否则就会直接输出点了。其实 echo 后面的点还可以用逗号(,)、分号(;)、冒号(:)、加号(+)、正斜线(/)、反斜线()、前中括号([)、后中括号(])里的任意一个字符来代替。

4、总结

4.1、学校里学的有没有用?

通过命令行手工编译类的知识往往只有科班才会讲解,有些培训结构和入门书籍中提都没提。我当初因为打字太慢没跟上节奏,看到四周的同学全都编译通过了,而我连类的代码都还没敲完。晚上回到宿舍后本想上网查资料继续完成白天没完成的内容,结果却看到很多人说没必要学这个,公司里都用 IDE,学校里学的没用……最后,我放弃了,同时我内心也产生了一些疑问,学校里学的这些真的没用吗?如果是这样,那老师为什么还要讲呢?

直到工作后的某一天,我遇到一个似乎超出能力范围的问题,现如今我已记不清楚是什么问题了。但我清楚的记得,网上某位大神给出的解决方案就是调出 cmd 然后键入几个命令回车即可,我照做之后果然搞定了。于是乎,我也慢慢开始尝试用 cmd 解决一些用图形化工具不好解决的问题。

后来我才逐渐理解,学习命令行手工编译相关知识,有助于让学生了解编译和执行的过程,加深学生的记忆和理解程度,锻炼学生的动手能力,培养学生的程序化思维。一个负责任的老师绝不希望自己的学生是那种只会用 IDE 等自动化工具,却没有思考和动手能力的人!

再后来我甚至开始劝告身边的某些人,别总把“学校里学的没用”挂嘴边!学校里你的老师主要是帮你搞好学习,因为学校主要看你学的怎么样;而公司里你的上司主要是帮你完成工作,因为公司主要看你干的怎么样。考核指标都变了,你又怎么能指望学校里学的东西能完全用到公司呢?即便你上家公司学到的东西也不能完全用到下家公司吧!

对于“学校里学的有没有用”这个问题,我后来一贯的主张是:如果你觉得学校里学的没用,那肯定是因为你没用!要么你选错了学习方向,学了却用不上;要么你根本没学会,学过却不知道有什么用!

4.2、本文总结

本文主要讲解了如何通过命令行工具来手工编译 C# 类和 Java 类。尽管有很多程序最终跑在 Linux 上,但绝大部分程序员依然是用 Windows 做开发。所以做为一名程序员,如果能学着用命令行工具,并在必要的时候合理运用,定能更快更好的完成开发任务。

事实上有些任务我们也只能用命令行工具来完成,因为 IDE 可能并没有提供相关功能或相关功能太不好用。譬如在 .NET 平台上,向 IIS 重新注册 Asp.Net 得用aspnet_regiis -i命令,注册系统服务得用installutil myService.exe命令,卸载系统服务得用installutil myService.exe -u命令等。事实上,无论是 .NET 平台还是 Java 平台,官方都提供了很多命令行工具。

C#/.NET 平台的命令行工具官方参考链接:

  • .NET Framework 工具
  • ASP.NET 命令行工具
  • C# Compiler Options
  • Microsoft Build Engine

Java 平台的命令行工具相关参考链接:

  • 官方:JavaSE Command Reference

4.3、本系列总结

本系列博文主要介绍了 Windows 命令行的基本使用方法和常见命令脚本,而且 cmd.exe 支持的命令 powershell.exe 一般也都能支持。本系列内容主要是结合 cmd.exe 来展开的,毕竟调用 cmd 更方便,我本人也更熟悉 cmd 一些。

下面是我在写本系列时搜集到的一些有关 Windows 命令行的参考站点或帖子(尽管本次写作过程中没用上,但以后再用到命令行的时候也许就能派上用场了,哈哈!):

  • 批处理之家
  • 批处理第三方命令行工具汇总
  • PowerShell 中文博客
  • 中国 DOS 联盟
  • bat吧
  • powershell吧

本文链接:http://www.cnblogs.com/hanzongze/p/cmd-compiles.html
版权声明:本文为博客园博主 韩宗泽 原创,作者保留署名权!欢迎通过转载、演绎或其它传播方式来使用本文,但必须在明显位置给出作者署名和本文链接!个人博客,能力有限,若有不当之处,敬请批评指正,谢谢!

转载于:https://www.cnblogs.com/hanzongze/p/cmd-compiles.html

探索Windows命令行系列(7):通过命令编译C#类和Java类相关推荐

  1. Windows命令行下常用网络命令解释大全

    命令行下常用网络命令解释大全 1.Arp 显示和修改"地址解析协议"(ARP) 所使用的到以太网的 IP 或令牌环物理地址翻译表.该命令只有在安装了 TCP/IP 协议之后才可用. ...

  2. 在 Windows 命令行中实现 cp 命令

    第一步,创建一个文本文件,输入如下内容: @echo off copy %* 第二步,将上面的文本文件另存为 cp.bat 保存到 C:\Windows 目录下,然后就可以用了 如果按照本示例的用法, ...

  3. 命令行下使用cl命令设置

    此文档集合了三篇文章的内容,分别是: http://www.xue5.com/Developer/C++/665229.html http://blog.csdn.net/daisy19900111/ ...

  4. EFI 分区/恢复分区不可删除?你需要使用命令行了(全命令行操作)

    Windows 系统在安装的时候,会自动为我们的磁盘划分一个恢复分区和一个 EFI 分区.如果后面不打算再用这些分区的时候,却发现无法删除. 本文将提供解决方法. 因为误操作会导致数据丢失,所以我将两 ...

  5. 命令行选项“/source-charset”与预编译头不一致

    命令行选项"/source-charset"与预编译头不一致 解决方法:不使用预编译头:

  6. 【Android 命令行工具】Android 命令行工具简介 ( 官方文档 | SDK 命令行工具 | SDK 构建工具 | SDK 平台工具 | 模拟器工具 | Jetifier 工具 )

    文章目录 一.官方文档 二.Android 命令行工具简介 1.SDK 命令行工具 2.SDK 构建工具 3.SDK 平台工具 4.模拟器工具 5.Jetifier 工具 一.官方文档 Android ...

  7. 安装jdk配置环境、cmd命令行测试环境变量配置是否正确及运行java程序、安装IDEA编写代码测试

    文章目录 1.安装jdk配置环境 2.cmd命令行测试环境变量配置是否正确及运行java程序 3.安装IDEA编写代码测试 1.安装jdk配置环境 首先打开官网Oracle https://www.o ...

  8. HDFS命令行客户端使用,命令行客户端支持的命令参数,常用命令参数介绍

    3.HDFS的shell(命令行客户端)操作 3.1 HDFS命令行客户端使用 HDFS提供shell命令行客户端,使用方法如下: [toto@hadoop hadoop-2.8.0]$ hdfs d ...

  9. linux命令行如何换行,一行命令太长,看的不清晰,

    linux命令行如何换行,一行命令太长,看的不清晰, 1.如图是列子; 2."\"  +ENTER 就可以实现换行 3.还有一个linux命令行的相关操作;ctrl+a, ctrl ...

最新文章

  1. 安装wdcp的方法和bug
  2. AWS:避免那些“神圣的法案”时刻的一些技巧
  3. SELECT语句,去除某个字段的重复信息
  4. java 流程控制篇 2021/02/26持续更新中
  5. IDEA:生成javadoc/断点调试/缓存和索引的清理
  6. IDEA里如何安装Python插件打造开发环境(图文详解)
  7. Python爬虫_BeauifulSoup
  8. 包头昆区多大面积_包头地铁“胎死腹中”,何时“卷土重来”?
  9. windows 笔记本连接公共wifi不弹出登录页面的处理办法
  10. 文件上传 文件大小和类型
  11. u盘读写测试_aigo U395固态U盘评测,速度可能会吓到你,价格很良心
  12. caffe 中solver.prototxt
  13. python一行代码太长_一行代码让python的运行速度提高100倍,你信吗?
  14. 2018年程序员考试大纲
  15. Scintilla的使用c++ build
  16. python卡方拟合性检验_卡方检验
  17. windows获取iOS设备信息
  18. 为什么微信打开小程序很慢_微信小程序应用打开很慢怎么办
  19. C语言 IO多路复用——poll函数
  20. 【汇正财经】红筹股和H股有什么区别?

热门文章

  1. Module build failed: ReferenceError: Unknown plugin module-resolver specified
  2. 发掘商业潜力 戴尔第13代服务器升级带动企业能效升级
  3. 列表页的动态条件搜索
  4. 基于WDF的PCI/PCIe接口卡Windows驱动程序(3)- 驱动程序代码(头文件)
  5. DelphiXE下的字符串变化
  6. 如何成为一位黑客 ( How To Become A Hacker )
  7. 修改系统时间导致myeclipse不能自动发布的解决方法
  8. RHEL5.5学习--LAMP环境的安装顺序及主要软件
  9. 大数据入门(一)-大数据概念和特点(1)
  10. cesium学习笔记(问题记录)——以cesium1.77版本为例