100162731.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 106 行 · 第 1/3 页
HTM
106 行
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100162731.htm'><font color='red'>1.2 公共语言运行库</font></a></h1>
<div id="divRelateNode" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100162730.htm'>1.1 C#与.NET的关系</a></div><div style='float:right;width:49%'>·<a href='100162732.htm'>1.3 中间语言</a></div><div style='float:left;width:49%'>·<a href='100162733.htm'>1.4 程序集</a></div><div style='float:right;width:49%'>·<a href='100162734.htm'>1.5 .NET Framework类</a></div><div style='float:left;width:49%'>·<a href='100162735.htm'>1.6 用C#创建.NET应用程序</a></div><div style='float:right;width:49%'>·<a href='100162736.htm'>1.7 C#在.NET企业体系结构中的作用</a></div></div>
</div>
</div>
</div>
<!-- main -->
<div id="main">
<div id="text"> <link href="css.css" rel="stylesheet" type="text/css" /><p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span lang="EN-US">.NET Framework</span><span style="FONT-FAMILY: 宋体">的核心是其运行库的执行环境,称为公共语言运行库</span><span lang="EN-US">(<span class="importantwords-PRODUCTION"><span style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'">CLR</span></span>)</span><span style="FONT-FAMILY: 宋体">或</span><span class="importantwords-PRODUCTION"><span lang="EN-US" style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'">.NET</span></span><span class="importantwords-PRODUCTION"><span style="FONT-WEIGHT: normal; FONT-FAMILY: 宋体">运行库。在</span></span><span class="importantwords-PRODUCTION"><span lang="EN-US" style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'">CLR</span></span><span class="importantwords-PRODUCTION"><span style="FONT-WEIGHT: normal; FONT-FAMILY: 宋体">的控制下运行的代码常常称为托管代码</span></span><span class="importantwords-PRODUCTION"><span lang="EN-US" style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'">(managed code)</span></span><span class="importantwords-PRODUCTION"><span style="FONT-WEIGHT: normal; FONT-FAMILY: 宋体">。</span></span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span style="FONT-FAMILY: 宋体">但是,在</span><span lang="EN-US">CLR</span><span style="FONT-FAMILY: 宋体">执行开发的源代码之前,需要编译它们</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">中或其他语言中</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。在</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">中,编译分为两个阶段:</span></p>
<p class="MsoNormal"><span lang="EN-US">(1) </span><span style="FONT-FAMILY: 宋体">把源代码编译为</span><span class="importantwords-PRODUCTION"><span lang="EN-US" style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'">Microsoft</span></span><span class="importantwords-PRODUCTION"><span style="FONT-WEIGHT: normal; FONT-FAMILY: 宋体">中间语言</span></span><span lang="EN-US">(<span class="importantwords-PRODUCTION"><span style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'">IL</span></span>)</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal"><span lang="EN-US">(2)</span><span lang="EN-US" style="FONT-FAMILY: 宋体"> </span><span lang="EN-US">CLR</span><span style="FONT-FAMILY: 宋体">把</span><span lang="EN-US">IL</span><span style="FONT-FAMILY: 宋体">编译为平台专用的代码。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这个两阶段的编译过程非常重要,因为</span><span class="importantwords-PRODUCTION"><span lang="EN-US" style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'">Microsoft</span></span><span class="importantwords-PRODUCTION"><span style="FONT-WEIGHT: normal; FONT-FAMILY: 宋体">中间语言</span></span><span class="importantwords-PRODUCTION"><span lang="EN-US" style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'">(</span></span><span class="importantwords-PRODUCTION"><span style="FONT-WEIGHT: normal; FONT-FAMILY: 宋体">托管代码</span></span><span class="importantwords-PRODUCTION"><span lang="EN-US" style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'">)</span></span><span class="importantwords-PRODUCTION"><span style="FONT-WEIGHT: normal; FONT-FAMILY: 宋体">是提供</span></span><span class="importantwords-PRODUCTION"><span lang="EN-US" style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'">.NET</span></span><span class="importantwords-PRODUCTION"><span style="FONT-WEIGHT: normal; FONT-FAMILY: 宋体">的许多优点的关键。下面看看其原因。</span></span></p>
<h3 style="MARGIN: 8.15pt 0cm"><span style="FONT-FAMILY: 黑体">托管代码的优点</span></h3>
<p class="MsoNormal"><span class="importantwords-PRODUCTION"><span lang="EN-US" style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'">Microsoft</span></span><span style="FONT-FAMILY: 宋体">中间语言与</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体">字节代码共享一种理念:它们都是一种低级语言,语法很简单</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">使用数字代码,而不是文本代码</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">,可以非常快速地转换为内部机器码。对于代码来说,这种精心设计的通用语法,有很重要的优点。</span></p>
<h4 style="TEXT-INDENT: 21.45pt"><span lang="EN-US">1. </span><span style="FONT-FAMILY: 黑体">平台无关性</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">首先,这意味着包含字节代码指令的同一文件可以放在任一平台中,运行时编译过程的最后阶段可以很容易完成,这样代码就可以运行在该特定的平台上。换言之,编译为中间语言就可以获得</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">平台无关性,这与编译为</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体">字节代码就会得到</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体">平台无关性是一样的。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">注意</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">的平台无关性目前只是一种可能,因为在编写本书时,</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">只能用于</span><span lang="EN-US">Windows</span><span style="FONT-FAMILY: 宋体">平台,但人们正在积极准备,使它可以用于其他平台</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">参见</span><span lang="EN-US">Mono</span><span style="FONT-FAMILY: 宋体">项目,它用于创建</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">的开放源代码的实现,参见</span><span class="screentext-PRODUCTION"><span lang="EN-US" style="FONT-FAMILY: 'Times New Roman'">http://www.go-mono.com/</span></span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。</span></p>
<h4 style="TEXT-INDENT: 21.45pt"><span style="FONT-FAMILY: 黑体">提高性能</span></h4>
<p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">比</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">Java</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">字节代码的作用还要大。</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">IL</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">总是即时编译的</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">(</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">称为</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">JIT</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">编译</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">)</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">,而</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">Java</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">字节代码常常是解释性的,</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">Java</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">的一个缺点是,在运行应用程序时,把</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">Java</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">字节代码转换为内部可执行代码的过程会导致性能的损失</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">(</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">但在最近,</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">Java</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">在某些平台上能进行</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">JIT</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">编译</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">)</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span lang="EN-US">JIT</span><span style="FONT-FAMILY: 宋体">编译器并不是把整个应用程序一次编译完</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">这样会有很长的启动时间</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">,而是只编译它调用的那部分代码</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">这是其名称由来</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。代码编译过一次后,得到的内部可执行代码就存储起来,直到退出该应用程序为止,这样在下次运行这部分代码时,就不需要重新编译了。</span><span lang="EN-US">Microsoft</span><span style="FONT-FAMILY: 宋体">认为这个过程要比一开始就编译整个应用程序代码的效率高得多,因为任何应用程序的大部分代码实际上并不是在每次运行过程中都执行。使用</span><span lang="EN-US">JIT</span><span style="FONT-FAMILY: 宋体">编译器,从来都不会编译这种代码。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span style="FONT-FAMILY: 宋体">这解释了为什么托管</span><span lang="EN-US">IL</span><span style="FONT-FAMILY: 宋体">代码的执行几乎和内部机器代码的执行速度一样快,但是并没有说明为什么</span><span lang="EN-US">Microsoft</span><span style="FONT-FAMILY: 宋体">认为这会提高性能。其原因是编译过程的最后一部分是在运行时进行的,</span><span lang="EN-US">JIT</span><span style="FONT-FAMILY: 宋体">编译器确切地知道程序运行在什么类型的处理器上,利用该处理器提供的任何特性或特定的机器代码指令来优化最后的可执行代码。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span style="FONT-FAMILY: 宋体">传统的编译器会优化代码,但它们的优化过程是独立于代码所运行的特定处理器的。这是因为传统的编译器是在发布软件之前编译为内部机器可执行的代码。即编译器不知道代码所运行的处理器类型,例如该处理器是</span><span lang="EN-US">x86</span><span style="FONT-FAMILY: 宋体">兼容处理器或</span><span lang="EN-US">Alpha</span><span style="FONT-FAMILY: 宋体">处理器,这超出了基本操作的范围。例如</span><span lang="EN-US">Visual Studio 6</span><span style="FONT-FAMILY: 宋体">优化了一台一般的</span><span lang="EN-US">Pentium</span><span style="FONT-FAMILY: 宋体">机器,所以它生成的代码就不能利用</span><span lang="EN-US">Pentium III</span><span style="FONT-FAMILY: 宋体">处理器的硬件特性。相反,</span><span lang="EN-US">JIT</span><span style="FONT-FAMILY: 宋体">编译器不仅可以进行</span><span lang="EN-US">Visual Studio 6</span><span style="FONT-FAMILY: 宋体">所能完成的优化工作,还可以优化代码所运行的特定处理器。</span></p>
<h4 style="TEXT-INDENT: 21.45pt"><span lang="EN-US">3. </span><span style="FONT-FAMILY: 黑体">语言的互操作性</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">不仅支持平台无关性,还支持语言的互操作性。简言之,就是能将任何一种语言编译为中间代码,编译好的代码可以与从其他语言编译过来的代码进行交互操作。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">那么除了</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">之外,还有什么语言可以通过</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">进行交互操作呢?下面就简要讨论其他常见语言如何与</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">交互操作。</span></p>
<p class="MsoNormal"><span lang="EN-US" style="FONT-FAMILY: Arial">VB</span><span lang="EN-US" style="FONT-FAMILY: Arial">.NET</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在升级到</span><span lang="EN-US">Visual Basic .NET</span><span style="FONT-FAMILY: 宋体">时,经历了一番脱胎换骨的变化。</span><span lang="EN-US">Visual Basic</span><span style="FONT-FAMILY: 宋体">是在最近的几年中演化的,其早期版本</span><span lang="EN-US">Visual Basic 6</span><span style="FONT-FAMILY: 宋体">并不适合运行</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">程序。例如,它与</span><span lang="EN-US">COM</span><span style="FONT-FAMILY: 宋体">的高度集成,且只把事件处理程序作为源代码显示给开发人员,大多数后台代码不能用作源代码。另外,它不支持继承,</span><span lang="EN-US">Visual Basic</span><span style="FONT-FAMILY: 宋体">使用的标准数据类型也与</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">不兼容。</span></p>
<p class="MsoNormal"><span lang="EN-US">Visual Basic 6</span><span style="FONT-FAMILY: 宋体">已经升级为</span><span lang="EN-US">Visual Basic .NET</span><span style="FONT-FAMILY: 宋体">,对</span><span lang="EN-US">VB</span><span style="FONT-FAMILY: 宋体">进行的改变非常大,完全可以把</span><span lang="EN-US">Visual Basic .NET</span><span style="FONT-FAMILY: 宋体">当作是一种新语言。现有的</span><span lang="EN-US">VB6</span><span style="FONT-FAMILY: 宋体">代码不能编译为</span><span lang="EN-US">VB.NET</span><span style="FONT-FAMILY: 宋体">代码,把</span><span lang="EN-US">VB6</span><span style="FONT-FAMILY: 宋体">程序转换为</span><span lang="EN-US">VB.NET</span><span style="FONT-FAMILY: 宋体">时,需要对代码进行大量的改动,但大多数修改工作都可以由</span><span lang="EN-US">Visual Studio .NET(VS</span><span style="FONT-FAMILY: 宋体">的升级版本,用于与</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">一起使用</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">自动完成。如果要把一个</span><span lang="EN-US">VB6</span><span style="FONT-FAMILY: 宋体">项目读取到</span><span lang="EN-US">Visual Studio .NET</span><span style="FONT-FAMILY: 宋体">中,</span><span lang="EN-US">Visual Studio .NET</span><span style="FONT-FAMILY: 宋体">就会升级该项目,也就是说把</span><span lang="EN-US">VB6</span><span style="FONT-FAMILY: 宋体">源代码重写为</span><span lang="EN-US">VB.NET</span><span style="FONT-FAMILY: 宋体">源代码。虽然这意味着其中的工作已大大减轻,但用户仍需要检查新的</span><span lang="EN-US">VB.NET</span><span style="FONT-FAMILY: 宋体">代码,以确保项目仍可正确工作,因为这种转换并不十分完美。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这种语言升级的一个副作用是不能再把</span><span lang="EN-US">VB.NET</span><span style="FONT-FAMILY: 宋体">编译为内部可执行代码了。</span><span lang="EN-US">VB.NET</span><span style="FONT-FAMILY: 宋体">只编译为中间语言,就像</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">一样。如果需要继续使用</span><span lang="EN-US">VB6</span><span style="FONT-FAMILY: 宋体">编写程序,就可以这么做,但生成的可执行代码会完全忽略</span><span lang="EN-US">.NET Framework</span><span style="FONT-FAMILY: 宋体">,如果继续把</span><span lang="EN-US">Visual Studio</span><span style="FONT-FAMILY: 宋体">作为开发环境,就需要安装</span><span lang="EN-US">Visual Studio 6</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal"><span lang="EN-US" style="FONT-FAMILY: Arial">Visual C++ .NET</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">有许多</span><span lang="EN-US">Microsoft</span><span style="FONT-FAMILY: 宋体">对</span><span lang="EN-US">Windows</span><span style="FONT-FAMILY: 宋体">的特定扩展。通过</span><span lang="EN-US">Visual C++ .NET</span><span style="FONT-FAMILY: 宋体">,又加入了更多的扩展内容,来支持</span><span lang="EN-US">.NET Framework</span><span style="FONT-FAMILY: 宋体">。现有的</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体">源代码会继续编译为内部可执行代码,不会有修改,但它会独立于</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">运行库运行。如果要让</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体">代码在</span><span lang="EN-US">.NET Framework</span><span style="FONT-FAMILY: 宋体">中运行,就要在代码的开头添加下述命令:</span></p>
<p class="2" style="MARGIN: 8.15pt 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">#using <mscorlib.dll></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">还要把标记</span><span lang="EN-US">/clr</span><span style="FONT-FAMILY: 宋体">传递给编译器,编译器假定要编译托管代码,因此会生成中间语言,而不是内部机器码。</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体">的一个有趣的问题是在编译托管代码时,编译器可以生成包含内嵌本机可执行代码的</span><span lang="EN-US">IL</span><span style="FONT-FAMILY: 宋体">。这表示在</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体">代码中可以把托管类型和非托管类型合并起来,因此托管</span><span lang="EN-US">C++ </span><span style="FONT-FAMILY: 宋体">代码:</span></p>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?