100165732.htm

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

HTM
482
字号


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
	
        28.4.4  COM互操作特性
</title></head>
<body>
    <div class="area">

        

        <div class="col1">
            <div class="lineBlue">
            </div>
            <!-- title -->
            <div class="arcTitle">
                <h1>
                    <a href="../16">
                        C#高级编程(第3版)【全文连载】
                    </a>
                </h1>
                <div style="text-align: center; font-size: 15px">
                    <a href="100165732.htm">
                        28.4.4  COM互操作特性
                    </a>
                </div>
                <div style="text-align: center; font-size: 15px">
                    <a class="url" href="../../default.htm">http://book.csdn.net/</a>
                    2006-10-13 14:41:00
                </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="divCurrentNode" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165732.htm'><font color='red'>28.4.4  COM互操作特性</font></a></h1>
                        <div id="divRelateNode" style="padding-left: 2px">
                        <div style='float:left;width:49%'>·<a href='100165729.htm'>28.4.1  COM Callable Wrapper</a></div><div style='float:right;width:49%'>·<a href='100165730.htm'>28.4.2  创建.NET组件</a></div><div style='float:left;width:49%'>·<a href='100165731.htm'>28.4.3  创建类型库</a></div><div style='float:right;width:49%'>·<a href='100165733.htm'>28.4.5  COM注册</a></div><div style='float:left;width:49%'>·<a href='100165734.htm'>28.4.6  创建COM客户程序</a></div><div style='float:right;width:49%'>·<a href='100165735.htm'>28.4.7  添加连接点</a></div></div>
                    </div>
                </div>
                </div>
            <!-- main -->
            <div id="main">
                <div id="text"> <link href="css.css" rel="stylesheet" type="text/css" /><h3 style='margin-top:8.15pt;margin-right:0cm;FTEL:8.15pt;margin-left:
0cm'><span lang=EN-US>28.4.4&nbsp; COM</span><span style='font-family:黑体'>互操作特性</span></h3>

<p class=MsoNormal><span style='font-family:宋体'>把命名空间</span><span lang=EN-US>System.Runtime.InteropServices</span><span
style='font-family:宋体'>中的特性应用于类、接口或方法,可以修改</span><span lang=EN-US>CCW</span><span
style='font-family:宋体'>的实现。</span></p>

<p class=a4 style='margin-top:8.15pt'><span style='font-family:黑体'>表</span><span
lang=EN-US>&nbsp; 28-2</span></p>

<table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0
 style='border-collapse:collapse;border:none'>
 <tr style='height:9.65pt'>
  <td width=102 valign=top style='width:76.3pt;border:solid windowtext 1.0pt;
  border-left:none;padding:0cm 5.4pt 0cm 5.4pt;height:9.65pt'>
  <p class=a4 style='margin-top:0cm'><span style='font-family:黑体'>特</span><span
  lang=EN-US>&nbsp;&nbsp;&nbsp; </span><span style='font-family:黑体'>性</span></p>
  </td>
  <td width=499 valign=top style='width:373.9pt;border-top:solid windowtext 1.0pt;
  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:none;
  padding:0cm 5.4pt 0cm 5.4pt;height:9.65pt'>
  <p class=a4 style='margin-top:0cm'><span style='font-family:黑体'>说</span><span
  lang=EN-US>&nbsp;&nbsp;&nbsp; </span><span style='font-family:黑体'>明</span></p>
  </td>
 </tr>
 <tr>
  <td width=102 valign=top style='width:76.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span lang=EN-US>Guid</span></p>
  </td>
  <td width=499 valign=top style='width:373.9pt;border:none;border-bottom:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span style='font-family:宋体'>这个特性可以赋予程序集、接口和类。把</span><span
  lang=EN-US>Guid</span><span style='font-family:宋体'>用作程序集特性,会定义类型库</span><span
  lang=EN-US>id</span><span style='font-family:宋体'>;把它应用于接口,会定义接口</span><span
  lang=EN-US>id(IID)</span><span style='font-family:宋体'>;把它设置为一个类,会定义类</span><span
  lang=EN-US>id(CLSID)</span><span style='font-family:宋体'>。</span></p>
  <p class=a3 style='margin-left:10.7pt'><span style='font-family:宋体'>使用这个特性需要定义的惟一</span><span
  lang=EN-US>ID</span><span style='font-family:宋体'>,可以用实用工具</span><span
  lang=EN-US>guidgeb</span><span style='font-family:宋体'>来创建。</span></p>
  <p class=a3 style='margin-left:10.7pt'><span style='font-family:宋体'>在每次建立程序时,都会自动修改</span><span
  lang=EN-US>CLSID</span><span style='font-family:宋体'>和类型库</span><span
  lang=EN-US>id</span><span style='font-family:宋体'>。如果不希望在每次建立程序时都改变它们,可以使用这个特性来固定它们。</span><span
  lang=EN-US>IID</span><span style='font-family:宋体'>只有在接口的签名改变时才被修改。例如,添加或删除了方法,或者改变了某些参数。因为在</span><span
  lang=EN-US>COM</span><span style='font-family:宋体'>中,</span><span lang=EN-US>IID</span><span
  style='font-family:宋体'>应在每个接口的新版本中改变,所以这是很好的默认方式,通常不需要对</span><span
  lang=EN-US>IID</span><span style='font-family:宋体'>应用</span><span lang=EN-US>Guid</span><span
  style='font-family:宋体'>特性。对接口应用固定</span><span lang=EN-US>IID</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>COM</span><span
  style='font-family:宋体'>客户希望使用这个标识符</span></p>
  </td>
 </tr>
 <tr>
  <td width=102 valign=top style='width:76.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span lang=EN-US>ProgId</span></p>
  </td>
  <td width=499 valign=top style='width:373.9pt;border:none;border-bottom:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span style='font-family:宋体'>这个特性可以应用于类,用于指定在注册表中配置对象时使用什么名称</span></p>
  </td>
 </tr>
 <tr>
  <td width=102 valign=top style='width:76.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span lang=EN-US>ComVisible</span></p>
  </td>
  <td width=499 valign=top style='width:373.9pt;border:none;border-bottom:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span style='font-family:宋体'>这个特性设置为</span><span
  lang=EN-US>false</span><span style='font-family:宋体'>时,可以在</span><span
  lang=EN-US>COM</span><span style='font-family:宋体'>中隐藏类、接口、委托。它禁止创建</span><span
  lang=EN-US>COM</span><span style='font-family:宋体'>表示</span></p>
  </td>
 </tr>
 <tr>
  <td width=102 valign=top style='width:76.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span lang=EN-US>InterfaceType</span></p>
  </td>
  <td width=499 valign=top style='width:373.9pt;border:none;border-bottom:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span style='font-family:宋体'>这个特性如果设置为</span><span
  lang=EN-US>COMInterfaceType</span><span style='font-family:宋体'>枚举值,就允许修改为</span><span
  lang=EN-US>.NET</span><span style='font-family:宋体'>接口创建的默认双重接口类型。</span><span
  lang=EN-US>COMInterfaceType</span><span style='font-family:宋体'>枚举值有</span><span
  lang=EN-US>InterfaceIsDual</span><span style='font-family:宋体'>、</span><span
  lang=EN-US>InterfaceIsIDispatch</span><span style='font-family:宋体'>和</span><span
  lang=EN-US>InterfaceIsIUnknown</span><span style='font-family:宋体'>。如果要把定制接口类型应用于</span><span
  lang=EN-US>.NET</span><span style='font-family:宋体'>接口,就如下设置这个特性:</span></p>
  <p class=a3 style='margin-left:10.7pt'><span lang=EN-US>[InterfaceType(ComInterfaceType.
  InterfaceIsIUnknown)]</span></p>
  </td>
 </tr>
 <tr>
  <td width=102 valign=top style='width:76.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span lang=EN-US>ClassInterface</span></p>
  </td>
  <td width=499 valign=top style='width:373.9pt;border:none;border-bottom:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span style='font-family:宋体'>这个特性允许修改为类创建的默认分派接口。</span><span
  lang=EN-US>ClassInterface</span><span style='font-family:宋体'>的参数是</span><span
  lang=EN-US>ClassInterfaceType</span><span style='font-family:宋体'>枚举的值。该枚举值有</span><span
  lang=EN-US>AutoDispatch</span><span style='font-family:宋体'>、</span><span
  lang=EN-US>AutoDual</span><span style='font-family:宋体'>和</span><span
  lang=EN-US>None</span><span style='font-family:宋体'>。在前面的示例中默认值是</span><span
  lang=EN-US>AutoDispatch</span><span style='font-family:宋体'>,因为创建了一个分派接口。如果类只能由定义的接口访问,就应给这个类应用属性</span><span
  lang=EN-US>[ClassInterface (ClassInterfaceType.None)]</span></p>
  </td>
 </tr>
 <tr>
  <td width=102 valign=top style='width:76.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span lang=EN-US>DispId</span></p>
  </td>
  <td width=499 valign=top style='width:373.9pt;border:none;border-bottom:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span style='font-family:宋体'>这个特性可以和双重和分派接口一起使用,以定义方法和特性的</span><span
  lang=EN-US>dispid</span></p>
  </td>
 </tr>
 <tr>
  <td width=102 valign=top style='width:76.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span lang=EN-US>In </span></p>
  <p class=a3 style='margin-left:10.7pt'><span lang=EN-US>Out</span></p>
  </td>
  <td width=499 valign=top style='width:373.9pt;border:none;border-bottom:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span style='font-family:宋体'>如果参数应发送给组件</span><span
  lang=EN-US>[In]</span><span style='font-family:宋体'>,或者参数从组件发送给客户</span><span
  lang=EN-US>[out]</span><span style='font-family:宋体'>,或者参数是双向的</span><span
  lang=EN-US>[In,out]</span><span style='font-family:宋体'>,</span><span
  lang=EN-US>COM</span><span style='font-family:宋体'>就允许把特性指定为参数类型</span></p>
  </td>
 </tr>
 <tr>
  <td width=102 valign=top style='width:76.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span lang=EN-US>Optional</span></p>
  </td>
  <td width=499 valign=top style='width:373.9pt;border:none;border-bottom:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=a3 style='margin-left:10.7pt'><span lang=EN-US>COM</span><span
  style='font-family:宋体'>方法的参数可以是可选的。可选参数可以用特性标记</span></p>
  </td>
 </tr>
</table>



<p class=MsoNormal><span style='font-family:宋体'>现在可以修改</span><span lang=EN-US>C#</span><span
style='font-family:宋体'>代码,为</span><span lang=EN-US>IWelcome</span><span
style='font-family:宋体'>接口指定双重接口类型,为</span><span lang=EN-US>IMath</span><span
style='font-family:宋体'>接口指定定制接口类型,用参数</span><span lang=EN-US>ClassInterfaceType.None</span><span
style='font-family:宋体'>为类</span><span lang=EN-US>DotNetComponent</span><span
style='font-family:宋体'>指定</span><span lang=EN-US>ClassInterface</span><span
style='font-family:宋体'>特性,不生成单独的</span><span lang=EN-US>COM</span><span
style='font-family:宋体'>接口、</span><span lang=EN-US>progid</span><span
style='font-family:宋体'>和</span><span lang=EN-US>guid</span><span
style='font-family:宋体'>:</span></p>

<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>&nbsp; [interfaceType(ComInterfaceType. InterfaceIsDual)]</span></p>

<p class=a5 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;
public interface IWelcome</span></p>

<p class=a5 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;
{</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;
[DispId(60040)]&nbsp;&nbsp;&nbsp;&nbsp; string Greeting(string name);</span></p>

<p class=a5 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;
}</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;
[interfaceType(ComInterfaceType. InterfaceIsIUnknown)]</span></p>

<p class=a5 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;
public interface IMath</span></p>

⌨️ 快捷键说明

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