100165404.htm

来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 145 行 · 第 1/2 页

HTM
145
字号
<p class="2" style="FTEL: 8.15pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">为了说明这些内容,下面修改了命名空间和类名,给类添加了</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">个方法。虚拟方法</span><span lang="EN-US">Hello2()</span><span style="FONT-FAMILY: 宋体">使用一个</span><span lang="EN-US">C</span><span style="FONT-FAMILY: 宋体">运行函数</span><span lang="EN-US">printf()</span><span style="FONT-FAMILY: 宋体">,以说明如何在托管类中使用本机代码。为了使这个方法可用,必须包括头文件</span><span lang="EN-US">stdio.h</span><span style="FONT-FAMILY: 宋体">。在</span><span lang="EN-US">Hello()</span><span style="FONT-FAMILY: 宋体">方法中,使用</span><span lang="EN-US">System </span><span style="FONT-FAMILY: 宋体">命名空间中的</span><span lang="EN-US">Console</span><span style="FONT-FAMILY: 宋体">托管类。</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">using namespace</span><span style="FONT-FAMILY: 宋体">语句类似于</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">using </span><span style="FONT-FAMILY: 宋体">语句,</span><span lang="EN-US">using namespace System</span><span style="FONT-FAMILY: 宋体">语句打开了</span><span lang="EN-US">System </span><span style="FONT-FAMILY: 宋体">命名空间,所以不需要编写</span><span lang="EN-US">System::Console::WriteLine()</span><span style="FONT-FAMILY: 宋体">。</span><span lang="EN-US">Hello()</span><span style="FONT-FAMILY: 宋体">方法也标记为</span><span lang="EN-US">virtual</span><span style="FONT-FAMILY: 宋体">,所以可以重写。在</span><span lang="EN-US">VB</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">类中重写</span><span lang="EN-US">Hello()</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><span lang="EN-US">Add()</span><span style="FONT-FAMILY: 宋体">返回两个</span><span lang="EN-US">int</span><span style="FONT-FAMILY: 宋体">参数的和,这样,就可以比较生成的</span><span lang="EN-US">MSIL</span><span style="FONT-FAMILY: 宋体">和不同语言,看看它们是如何处理数字的。这</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">个示例都使用相同的命名空间</span><span lang="EN-US">Wrox.ProCSharp. Assemblies.CrossLanguage</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt"><span lang="EN-US">// HelloMCPP.h</span></p>
<p class="a6" style="LINE-HEIGHT: 16pt"><span lang="EN-US">#pragma once</span></p>
<p class="2" style="MARGIN-TOP: 6pt; LINE-HEIGHT: 16pt"><span lang="EN-US">#include &lt;stdio.h&gt;</span></p>
<p class="2" style="LINE-HEIGHT: 16pt"><span lang="EN-US">using namespace System;</span></p>
<p class="2" style="LINE-HEIGHT: 16pt"><span lang="EN-US">namespace Wrox</span></p>
<p class="2"><span lang="EN-US">{</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp; namespace ProCSharp</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp; {</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; namespace Assemblies</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; namespace CrossLanguage</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public </span><span lang="EN-US" style="FONT-FAMILY: &quot;Baskerville BE Regular&quot;">__</span><span lang="EN-US">gc class HelloMCPP</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public:</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; virtual void Hello()</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console::WriteLine(S&quot;Hello, Managed C++&quot;);</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; virtual void Hello2()</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;Hello, calling native code\n&quot;);</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int Add(int val1, int val2)</span></p>
<p class="2" style="LINE-HEIGHT: 14.3pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return val1 + val2;</span></p>
<p class="2" style="LINE-HEIGHT: 14.5pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="2" style="LINE-HEIGHT: 14.5pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</span></p>
<p class="2" style="LINE-HEIGHT: 14.5pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="2" style="LINE-HEIGHT: 14.5pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="2" style="LINE-HEIGHT: 14.5pt"><span lang="EN-US">&nbsp;&nbsp; }</span></p>
<p class="2" style="LINE-HEIGHT: 14.5pt; FTEL: 8.15pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17.6pt"><span style="FONT-FAMILY: 宋体">要比较程序和运行的代码之间的不同,我们使用发布配置,而不是调试配置。使用调试配置会看到未优化的</span><span lang="EN-US">IL</span><span style="FONT-FAMILY: 宋体">代码。看看使用</span><span lang="EN-US">ILDASM</span><span style="FONT-FAMILY: 宋体">生成的</span><span lang="EN-US">DLL(</span><span style="FONT-FAMILY: 宋体">如图</span><span lang="EN-US">13-14</span><span style="FONT-FAMILY: 宋体">所示</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">,除了类</span><span lang="EN-US">HelloMCPP</span><span style="FONT-FAMILY: 宋体">及其成员之外,还有一个静态方法</span><span lang="EN-US">printf()</span><span style="FONT-FAMILY: 宋体">。这个方法使用</span><span lang="EN-US">pinvoke</span><span style="FONT-FAMILY: 宋体">调用本机非托管函数。私有字段</span><span lang="EN-US">$ArrayType$0xf2eda509</span><span style="FONT-FAMILY: 宋体">保存字符串</span><span lang="EN-US">&quot;Hello, calling native code\n&quot;</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p align="center"><span lang="EN-US"><img height="205" src="13/image024.jpg" width="234" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-14 </span></p>
<p class="MsoNormal"><span lang="EN-US">Hello2()</span><span style="FONT-FAMILY: 宋体">方法提取字段</span><span lang="EN-US">$ArrayType$0xf2eda509</span><span style="FONT-FAMILY: 宋体">的地址,在堆栈中保存字符串。在</span><span lang="EN-US">IL_0005</span><span style="FONT-FAMILY: 宋体">行上,调用了静态方法</span><span lang="EN-US">printf()</span><span style="FONT-FAMILY: 宋体">,其中传送了一个字符串指针</span><span lang="EN-US">&quot;Hello</span><span style="FONT-FAMILY: 宋体">,</span><span lang="EN-US">calling native code&quot;</span><span style="FONT-FAMILY: 宋体">,如图</span><span lang="EN-US">13-15</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="134" src="13/image025.jpg" width="373" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-15</span></p>
<p class="MsoNormal"><span lang="EN-US">printf()</span><span style="FONT-FAMILY: 宋体">本身通过平台调用机制来调用</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">如图</span><span lang="EN-US">13-16</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">Win32 API</span><span style="FONT-FAMILY: 宋体">调用。</span></p>
<p align="center"><span lang="EN-US"><img height="142" src="13/image026.jpg" width="432" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-16</span></p>
<p class="MsoNormal"><span lang="EN-US">Hello()</span><span style="FONT-FAMILY: 宋体">方法完全是由</span><span lang="EN-US">MSIL</span><span style="FONT-FAMILY: 宋体">代码组成,没有本机代码。因为字符串有前缀</span><span lang="EN-US">S</span><span style="FONT-FAMILY: 宋体">,所以托管的字符串就会写入程序集,并用</span><span lang="EN-US">ldstr</span><span style="FONT-FAMILY: 宋体">推入堆栈。在</span><span lang="EN-US">IL_0005</span><span style="FONT-FAMILY: 宋体">行上,调用了</span><span lang="EN-US">System.Console</span><span style="FONT-FAMILY: 宋体">类的</span><span lang="EN-US">WriteLine()</span><span style="FONT-FAMILY: 宋体">方法,使用堆栈中的字符串,如图</span><span lang="EN-US">13-17</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="142" src="13/image027.jpg" width="433" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-17</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">要说明在</span><span lang="EN-US">Managed C++</span><span style="FONT-FAMILY: 宋体">中如何使用数字,下面看看</span><span lang="EN-US">Add()</span><span style="FONT-FAMILY: 宋体">方法的</span><span lang="EN-US">MSIL</span><span style="FONT-FAMILY: 宋体">代码。通过</span><span lang="EN-US">ldarg.1</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">ldarg.2</span><span style="FONT-FAMILY: 宋体">,把传送的参数入栈,</span><span lang="EN-US">Add</span><span style="FONT-FAMILY: 宋体">添加堆栈值,把结果入栈,在</span><span lang="EN-US">IL_0003</span><span style="FONT-FAMILY: 宋体">行上,返回了结果,如图</span><span lang="EN-US">13-18</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="146" src="13/image028.jpg" width="431" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-18</span></p>
<p class="a3" style="MARGIN-TOP: 8.15pt; FTEL: 21.45pt"><span style="FONT-FAMILY: 黑体">注意:</span></p>
<p class="a1" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 10.7pt; MARGIN-RIGHT: 0cm; FTEL: 10.7pt"><span style="FONT-FAMILY: 楷体_GB2312">与使用</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 楷体_GB2312">和</span><span lang="EN-US">.NET Framework</span><span style="FONT-FAMILY: 楷体_GB2312">的其他语言相比,使用</span><span lang="EN-US">Managed C++</span><span style="FONT-FAMILY: 楷体_GB2312">有什么优点?</span><span lang="EN-US">Managed C++</span><span style="FONT-FAMILY: 楷体_GB2312">很容易把传统的</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 楷体_GB2312">代码用于</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 楷体_GB2312">。</span><span lang="EN-US">MSIL</span><span style="FONT-FAMILY: 楷体_GB2312">代码和本机代码很容易混合在一起。</span></p></div>
                <!-- page -->
                <div class="page" style="text-align: center">
                    <a href="100165403.htm">上一页</a>&nbsp;&nbsp;&nbsp;<a href="index.html">首页</a>&nbsp;&nbsp;&nbsp;<a href="100165405.htm">下一页</a>
                </div>
              
                <div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
                    <div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
                        图书导读
                    </div>
                    <div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
                        <!--导读-->
                        <h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165404.htm'><font color='red'>13.3.2  语言无关性(1)</font></a></h1>
                        <div id="divRealteNod2" style="padding-left: 2px">
                        <div style='float:left;width:49%'>·<a href='100165401.htm'>13.2.5  构建程序集</a></div><div style='float:right;width:49%'>·<a href='100165402.htm'>13.3  跨语言支持</a></div><div style='float:left;width:49%'>·<a href='100165403.htm'>13.3.1  CTS和CLS</a></div><div style='float:right;width:49%'>·<a href='100165405.htm'>13.3.2  语言无关性(2)</a></div><div style='float:left;width:49%'>·<a href='100165406.htm'>13.3.3  CLS要求</a></div><div style='float:right;width:49%'>·<a href='100165407.htm'>13.4  全局程序集缓存</a></div></div>
                    </div>
                </div>
                </div></div>
   
</body>
</html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?