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 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> 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> </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> </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> [interfaceType(ComInterfaceType. InterfaceIsDual)]</span></p>
<p class=a5 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
public interface IWelcome</span></p>
<p class=a5 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
{</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
[DispId(60040)] string Greeting(string name);</span></p>
<p class=a5 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
}</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
[interfaceType(ComInterfaceType. InterfaceIsIUnknown)]</span></p>
<p class=a5 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
public interface IMath</span></p>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?