<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>CLR &amp; Silverlight上海研发团队的Blog : CLR Interop</title><link>http://blogs.msdn.com/silverlightshanghai/archive/tags/CLR+Interop/default.aspx</link><description>Tags: CLR Interop</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>CLR 4 新特性 ------ 概览</title><link>http://blogs.msdn.com/silverlightshanghai/archive/2009/06/06/clr-4.aspx</link><pubDate>Sat, 06 Jun 2009 17:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9704409</guid><dc:creator>SilverlightShanghai</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/silverlightshanghai/comments/9704409.aspx</comments><wfw:commentRss>http://blogs.msdn.com/silverlightshanghai/commentrss.aspx?PostID=9704409</wfw:commentRss><description>&lt;P&gt;.NET 4中发布了最新版本的公共语言运行时，简称CLR (Common Language Runtime) 。这个版本是CLR 2.0之后又一个新的版本，包含着CLR小组几年以来的辛勤工作。&lt;/P&gt;
&lt;P&gt;CLR上海团队计划在未来的几个月内陆续介绍其中的一些特性，本文作为一个概览，先作蜻蜓点水，抛砖引玉。也欢迎大家回复本文，告诉我们你所感兴趣的话题，我们会进一步作深入的介绍。&lt;/P&gt;
&lt;H3&gt;CLR 简介&lt;/H3&gt;
&lt;P&gt;CLR作为.NET框架中最为底层的部件，扮演着运行托管代码虚拟机的角色，承担着诸如即时编译(Just In Time Compile)，垃圾回收(Garbage Collect)等任务。打一个比方，如果把操作系统看做是运行二进制程序的宿主，那么CLR就是托管世界的操作系统。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CLR4_14D7E/netframework_2.gif" mce_href="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CLR4_14D7E/netframework_2.gif"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=netframework border=0 alt=netframework src="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CLR4_14D7E/netframework_thumb.gif" width=272 height=157 mce_src="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CLR4_14D7E/netframework_thumb.gif"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;图一 CLR 在.NET框架中所处的位置&lt;/P&gt;
&lt;P&gt;CLR作为.NET框架中的一部分，总是跟着.NET发行，但是近年来.NET的发行版本从2.0一直到3.5, 但是CLR却还一直保留在2.0，如下表所示： 
&lt;TABLE border=1 cellSpacing=0 cellPadding=0 width=397 bgColor=#cccccc&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=231&gt;
&lt;P&gt;&lt;B&gt;.NET&lt;/B&gt;&lt;B&gt;框架版本&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=97&gt;
&lt;P&gt;&lt;B&gt;时间&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=67&gt;
&lt;P&gt;&lt;B&gt;CLR &lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=230&gt;
&lt;P&gt;1.0&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=97&gt;
&lt;P&gt;2002.2&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=68&gt;
&lt;P&gt;1.0&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=230&gt;
&lt;P&gt;1.1&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=97&gt;
&lt;P&gt;2003.4&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=68&gt;
&lt;P&gt;1.1&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=230&gt;
&lt;P&gt;2.0 (Generics)&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=97&gt;
&lt;P&gt;2006.1&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=68&gt;
&lt;P&gt;2.0&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=230&gt;
&lt;P&gt;3.0 (WPF/WCF/WF)&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=97&gt;
&lt;P&gt;2006.11&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=68&gt;
&lt;P&gt;2.0&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=230&gt;
&lt;P&gt;3.5 (LINQ)&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=97&gt;
&lt;P&gt;2007.11&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=68&gt;
&lt;P&gt;2.0&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=230&gt;
&lt;P&gt;4.0 Beta&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=98&gt;
&lt;P&gt;2009.5&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=69&gt;
&lt;P&gt;4.0&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;图二 CLR 版本&lt;/P&gt;
&lt;P&gt;大家可以看到，2.0的发行已经是三年之前的事情了，在这几年中，CLR小组的工作最后都汇集在了这次发行之中，可谓是众星云集，下面我们一一叙来。&lt;/P&gt;
&lt;H3&gt;托管与本地代码的互操作&lt;/H3&gt;
&lt;P&gt;托管代码与本地代码之间的互操作(interop)担负着.NET世界对外联系的责任。比如调用一个本地dll或者COM组件。在CLR 4中，我们作了以下工作，来提高互操作的易用性。&lt;/P&gt;
&lt;P&gt;网络广播：&lt;A href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032417433&amp;amp;Culture=zh-CN"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032417433&amp;amp;Culture=zh-CN&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;1. 自定义QI(Custom QI)&lt;/P&gt;
&lt;P&gt;当托管代码被COM调用的时候，它扮演着COM组件的角色。对于COM组件来说，IUnknown::QueryInerface(QI)是类型转化的关键。CLR4之前，为每个托管COM组件提供了一个QI实现; CLR4 允许用户自定义QI，大家可以从mscorlib中新增的interface，&lt;FONT color=#0080ff&gt;System.Runtime.InteropServices.ICustomQueryInterface&lt;/FONT&gt;着手了解这一新功能。&lt;/P&gt;
&lt;P&gt;2. TlbImp源代码以及自定义工具&lt;/P&gt;
&lt;P&gt;在托管代码中调用COM组件，需要这个COM组件用托管语言申明自己的接口，也就是Interop Assembly(IA)。在一般情况下，用户不需要自己动手撰写这些assembly，而可以使用TlbImp这个工具，根据TLB生成IA。在CLR 4的开发中，我们用托管代码把TlbImp重写了，并且把源代码公布在了&lt;A href="http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=17579" mce_href="http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=17579"&gt;codeplex&lt;/A&gt;上面。&lt;/P&gt;
&lt;P&gt;发布TlbImp的源代码的好处之一，是方便使用者根据自己的需求，通过修改源代码来自拓展TlbImp的功能。我们也收集了很多客户需要自定义TlbImp的要求，并且提取了一些呼声最高的自定义请求，制作了TlbImp自定义工具，也在&lt;A href="http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=17579" mce_href="http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=17579"&gt;codeplex&lt;/A&gt;发行。详见&lt;A href="http://blogs.msdn.com/silverlightshanghai/archive/2009/03/13/codeplex-tlbimp.aspx" mce_href="http://blogs.msdn.com/silverlightshanghai/archive/2009/03/13/codeplex-tlbimp.aspx"&gt;http://blogs.msdn.com/silverlightshanghai/archive/2009/03/13/codeplex-tlbimp.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;3. 等价类型&lt;/P&gt;
&lt;P&gt;前面提到，COM组件要为.NET所用，需要Interop Assembly。不同版本的COM组件，带来了部署上的问题。在CLR 4.0之中，我们通过等价类型的引入，就部署IA的问题，给出了更好的解决方案。&lt;/P&gt;
&lt;P&gt;4. &lt;A href="http://blogs.msdn.com/silverlightshanghai/archive/2009/06/17/clr-4-0-beta1-stub-method-redirection.aspx" mce_href="http://blogs.msdn.com/silverlightshanghai/archive/2009/06/17/clr-4-0-beta1-stub-method-redirection.aspx"&gt;StubMethodReditection&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;自定义Stub来处理Interop中的Marshalling和目标函数调用；&lt;/P&gt;
&lt;P&gt;5. 其他&lt;/P&gt;
&lt;P&gt;Interop其他方面的改动，使用COM取代了原先的远程对象访问；让用户自己决定清理RCW的时机等等，会有更为详细的博文作具体介绍。&lt;/P&gt;
&lt;H3&gt;垃圾回收&lt;/H3&gt;
&lt;P&gt;垃圾回收一直是CLR中的核心模块，对托管程序运行的性能至关重要。在这个版本中，CLR引入了background GC，和原来的Concurrent GC相比，在GC进行的过程中，会更少的阻断其他进程，从而提高整个CLR的运行效率。同时，此前在sp2中引入的&lt;FONT color=#0080ff&gt;GC::RegisterForFullGCNotification&lt;/FONT&gt;可以让 CLR4.0可以通知用户第二代GC发生，从而使服务器有机会处理负载平衡，使得整个服务器端的处理能力不至于因为GC的发生受到太大的影响。&lt;/P&gt;
&lt;H3&gt;代码约定&lt;/H3&gt;
&lt;P&gt;在CLR4.0中，引入了代码约定，更方便用户规范代码的行为，大家可以从&lt;FONT color=#0080ff&gt;System.Diagnostics.Contracts&lt;/FONT&gt;这一命名空间着手，进一步了解其内容。&lt;/P&gt;
&lt;H3&gt;Corrupted state exception&lt;/H3&gt;
&lt;P&gt;CLR 4.0中，对异常处理的哲学有了一个改进：在默认情况下，try/catch语句将不能捕获诸如AccessViolationException等异常。因为这些异常的损毁(Corrupt)了机器的状态(state)，即使用户捕获了它们，也无法继续执行代码，或者说，继续执行代码也会变得非常危险。&lt;/P&gt;
&lt;H3&gt;新的安全模型&lt;/H3&gt;
&lt;P&gt;用过CLR v2的安全模型的朋友们可能还会记得诸如Evidence，Policy以及Permission等概念，这些复杂的对象一起构筑了v2的安全模型的框架，CLR4.0中，安全模型被大大简化，&lt;FONT color=#0080ff&gt;SecurityCritical，SecurSafeCritical&lt;/FONT&gt;等一些安全级别构筑了新的安全模型的基础。&lt;/P&gt;
&lt;H3&gt;同一个进程，多个CLR&lt;/H3&gt;
&lt;P&gt;CLR4.0的出现，又添加了一个CLR的版本，尽管我们尽量保证各个不同版本之间的兼容性，但是还是可能出现一些已经开发的组件，需要特定的版本才能运行。为了确保用户过去编写的组件不会因为新的CLR版本而不能运行，CLR4.0中允许用户在一个进程中，运行不同的CLR版本，这样不同的组建就可以各取所需，运行在适合他们的CLR中了。&lt;/P&gt;
&lt;H3&gt;基本类库&lt;/H3&gt;
&lt;P&gt;基本类库，也就是mscorlib.dll，包括了诸如System.Object这样在整个类型系统中最为核心的类库。CLR4.0也包含了很多新功能：比如用于支持动态语言的&lt;FONT color=#0080ff&gt;System.Tuple&lt;/FONT&gt;,新的集合类型&lt;FONT color=#0080ff&gt;System.Collections.Generic.SortedSet&lt;/FONT&gt;，用于提高文件系统浏览性能的API，操作注册表的API，以及对内存映射文件的支持等等。&lt;/P&gt;
&lt;P&gt;总的来说，CLR4.0相较于CLR2.0，在保证了很高的兼容性的同时，做了大量的改进工作，在之后的一系列博客中，我们团队的成员会进一步作更为具体的介绍，敬请大家期待。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9704409" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/silverlightshanghai/archive/tags/CLR_B065FB95_/default.aspx">CLR新闻</category><category domain="http://blogs.msdn.com/silverlightshanghai/archive/tags/CLR+Interop/default.aspx">CLR Interop</category><category domain="http://blogs.msdn.com/silverlightshanghai/archive/tags/CLR+4.0/default.aspx">CLR 4.0</category></item><item><title>字符串marshalling进阶篇</title><link>http://blogs.msdn.com/silverlightshanghai/archive/2009/06/01/marshalling.aspx</link><pubDate>Mon, 01 Jun 2009 07:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9752077</guid><dc:creator>SilverlightShanghai</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/silverlightshanghai/comments/9752077.aspx</comments><wfw:commentRss>http://blogs.msdn.com/silverlightshanghai/commentrss.aspx?PostID=9752077</wfw:commentRss><description>&lt;p&gt;1. 字符串Marshalling基础&lt;/p&gt;  &lt;p&gt;在本地代码中,字符串按编码可分为ASNI字符串和Unicode字符串，按实现不同，可分为LPSTR(char*,wchar*)和BSTR。&lt;/p&gt;  &lt;p&gt;在托管代码中，与字符串相关的有String,stringBuilder两个。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;为了实现本地代码与托管代码中字符串的相互转换，Marshalling 引入了几个属性值。&lt;/p&gt;  &lt;p&gt;BSTR系列&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;UnmanagedType.AnsiBStr&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;UnmanagedType.BStr [COM Interop中为默认值］&lt;/p&gt;    &lt;p&gt;UnmanagedTYpe.TBStr&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;LPSTR系列:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;UnmanagedType.LPStr&lt;/p&gt;    &lt;p&gt;UnmanagedType.LPWStr&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;UnmanagedType.LPTStr［批女哦棵中为默认值］&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;2.字符串的内存操作&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;LPString的内存操作: &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt; 本地代码相关函数：CoTaskMemAlloc,CoTaskMemFree&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;BSTR的内存操作: &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt; 本地代码相关函数：SysAllocString,SysFreeString&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;3. String和StringBuilder在Marshalling中的区别&lt;/p&gt;  &lt;p&gt;在Marshalling中，如果你要传递的字符串仅仅需要在原有的字符串中改变某个或某几个字符（in-place change），在这种情况下，你就最好在托管代码中使用StringBuilder,而不是string。&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9752077" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/silverlightshanghai/archive/tags/CLR+Interop/default.aspx">CLR Interop</category></item><item><title>.NET Interop入门-P/Invoke和Reverse P/Invoke</title><link>http://blogs.msdn.com/silverlightshanghai/archive/2009/03/29/net-interop-p-invoke-reverse-p-invoke.aspx</link><pubDate>Sat, 28 Mar 2009 18:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9517250</guid><dc:creator>SilverlightShanghai</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/silverlightshanghai/comments/9517250.aspx</comments><wfw:commentRss>http://blogs.msdn.com/silverlightshanghai/commentrss.aspx?PostID=9517250</wfw:commentRss><description>&lt;pre class="csharpcode"&gt;&lt;/pre&gt;
&lt;p&gt;最近在论坛上经常看到一些基本的interop的问题，给我动力写完之前的.net interop入门系列，给刚刚涉足.NET&amp;nbsp; interop的朋友们一个大体上的概念。&lt;/p&gt;
&lt;p&gt;每每谈及.NET interop，我的脑中总是出现下面一幅图:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/aef56072.NETInteropPInvokeReversePInvoke_5D3/interop_2.jpg"&gt;&lt;img title="interop" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="138" alt="interop" src="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/aef56072.NETInteropPInvokeReversePInvoke_5D3/interop_thumb.jpg" width="540" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;该图代表了.net interop的四个典型场景。之前我的同事和我讨论了.NET和COM互操作的应用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在.NET中调用COM：&lt;a href="http://blog.csdn.net/mountaintaiII/archive/2008/04/15/2295474.aspx" target="_blank"&gt;COM Interop入门&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;在COM中调用.NET：&lt;a href="http://blogs.msdn.com/silverlightshanghai/archive/2008/07/23/com-net.aspx" target="_blank"&gt;在COM应用中使用.NET组件&lt;/a&gt;，&lt;a href="http://blogs.msdn.com/silverlightshanghai/archive/2008/07/22/idispatch-invoke-c-c.aspx" target="_blank"&gt;使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法&lt;/a&gt;。&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;今天我主要讲一下P/Invoke和Reverse P/Invoke，和COM interop相比，P/Invoke无需注册组件，使用上更轻量，更绿色。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. P/Invoke&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;P/Invoke(platform invoke)是.NET调用本地代码(native code)的一种比较轻便的方式。只需要将本地代码编写成动态链接库，然后在c#代码中，声明一个外部静态函数，并且用DllImport属性指明动态连接库的入口。举例如下：&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.InteropServices;

&lt;span class="kwrd"&gt;class&lt;/span&gt; PInvoke
{
    [DllImportAttribute(&lt;span class="str"&gt;"user32.dll"&lt;/span&gt;, EntryPoint = &lt;span class="str"&gt;"MessageBoxW"&lt;/span&gt;)]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt;  &lt;span class="kwrd"&gt;int&lt;/span&gt; MessageBoxW(
        [In]System.IntPtr hWnd,
        [In][MarshalAs(UnmanagedType.LPWStr)] &lt;span class="kwrd"&gt;string&lt;/span&gt; lpText,
        [In][MarshalAs(UnmanagedType.LPWStr)] &lt;span class="kwrd"&gt;string&lt;/span&gt; lpCaption,
        &lt;span class="kwrd"&gt;uint&lt;/span&gt; uType);

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main()
    {
        MessageBoxW(IntPtr.Zero, &lt;span class="str"&gt;"Hello"&lt;/span&gt;, &lt;span class="str"&gt;"Interop"&lt;/span&gt;, 0);
    }
}&lt;/pre&gt;
&lt;p&gt;稍加解释这个代码。类PInvoke中，有个MessageBoxW的函数声明，它的实现在user32.dll(系统自带)中，入口是MessageBoxW，参数的构成是根据windows API的声明而定的，我们在&lt;a href="http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120" target="_blank"&gt;Codeplex上有一个工具&lt;/a&gt;，专门帮助大家声称一个本地代码(c++)编写的函数在托过代码(c#)中的函数声明，之前我们团队的成员也&lt;a href="http://blogs.msdn.com/silverlightshanghai/archive/2008/06/17/p-invoke-interop-assistant-p-invoke.aspx" target="_blank"&gt;撰文&lt;/a&gt;介绍了这个工具的使用。&lt;/p&gt;
&lt;p&gt;有了这个声明以后，在Main中调用MessageBox，就和调用其他托管代码一样轻松自如了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Reverse P/Invoke&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;接着，我们来看看在本地代码中调用.NET方法。本地代码需要拿到一个.NET委托(delegate)，然后把这个delegate当作一个函数指针使用，示例如下：&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Forms;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.InteropServices;

&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Program
{
    &lt;span class="kwrd"&gt;internal&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DelegateMessageBox([MarshalAs(UnmanagedType.LPWStr)]&lt;span class="kwrd"&gt;string&lt;/span&gt; msg);

    [DllImport(&lt;span class="str"&gt;"Native.dll"&lt;/span&gt;, CallingConvention = CallingConvention.Cdecl)]
    &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; NativeMethod(DelegateMessageBox d);

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ShowMessageBox(&lt;span class="kwrd"&gt;string&lt;/span&gt; msg)
    {
       MessageBox.Show(msg);
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main()
    {
        NativeMethod(&lt;span class="kwrd"&gt;new&lt;/span&gt; DelegateMessageBox(ShowMessageBox));
    }
}&lt;/pre&gt;
&lt;p&gt;这个例子中，我们希望本地代码能够调用托管函数ShowMessageBox来显示一个对话框。为了让本地代码可以调用这个函数，我们根据它的声明，定了了一个delegate，并且通过P/Invoke把这个委托传给了本地代码。本地代码可以如下调用托管代码：&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="preproc"&gt;#include&lt;/span&gt; &amp;lt;stdio.h&amp;gt;
&lt;span class="preproc"&gt;#include&lt;/span&gt; &amp;lt;wtypes.h&amp;gt;

&lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="str"&gt;"C"&lt;/span&gt; {
    &lt;span class="kwrd"&gt;__declspec&lt;/span&gt;(&lt;span class="kwrd"&gt;dllexport&lt;/span&gt;) &lt;span class="kwrd"&gt;void&lt;/span&gt; NativeMethod(&lt;span class="kwrd"&gt;void&lt;/span&gt; (&lt;span class="kwrd"&gt;__stdcall&lt;/span&gt; *pShowMsgBox)(WCHAR *wChar))
    {
        (*pShowMsgBox)(L&lt;span class="str"&gt;"hello reverse interop"&lt;/span&gt;);
    }
}
&lt;/pre&gt;
&lt;p&gt;注意到托管代码中的委托到了本地代码中，就是一个函数指针，本地代码可以像一个普通的函数指针一般调用托管代码。&lt;/p&gt;
&lt;p&gt;大家可能注意到dll的声明用了extern “C”，它指明了调用规范是cdecl，在之前的托过代码的DllImport中，也相应的注明了调用约定，关于调用约定的详细介绍，可以参见我的另一篇&lt;a href="http://blog.csdn.net/mountaintaiII/archive/2009/03/12/3985729.aspx" target="_blank"&gt;博客&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;今天的介绍就到这里，大家可以把这些示例代码当作一个template，根据实际需求作相应的具体改动。&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9517250" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/silverlightshanghai/archive/tags/CLR+Interop/default.aspx">CLR Interop</category><category domain="http://blogs.msdn.com/silverlightshanghai/archive/tags/.NET_0F5C348DEB58_/default.aspx">.NET小贴士</category></item><item><title>CodePlex上TlbImp新版本发布：基于规则的自定义功能</title><link>http://blogs.msdn.com/silverlightshanghai/archive/2009/03/13/codeplex-tlbimp.aspx</link><pubDate>Fri, 13 Mar 2009 10:31:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9472815</guid><dc:creator>SilverlightShanghai</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/silverlightshanghai/comments/9472815.aspx</comments><wfw:commentRss>http://blogs.msdn.com/silverlightshanghai/commentrss.aspx?PostID=9472815</wfw:commentRss><description>&lt;p&gt;大家好。距离上次我们发布在CodePlex上的新版本TlbImp已经过了快半年了。在这半年的时间内，除了主要进行.NET 4.0相关的新功能开发之外，我们上海CLR小组也没有忘记进行TlbImp相关功能的继续开发，于今年3月9日再次发布了TlbImp的一个新版本：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=17579"&gt;http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=17579&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;这次版本中我们引入了两个重要功能：&lt;/p&gt;  &lt;p&gt;1. 通过规则自定义互操作程序集以及规则自定义编辑器&lt;/p&gt;  &lt;p&gt;2. 回归测试工具&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;基于规则的自定义功能&lt;/u&gt;&lt;/b&gt;&lt;b&gt;&lt;u&gt;&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;我们先来看一下自定义功能。这个新版本的TlbImp允许用户通过自定义的一系列的规则来指定TlbImp如何生成最终的互操作程序集。之前有不少用户向我们提到在使用TlbImp的时候，经常需要对TlbImp生成的结果做一些修改，而且必须是自动化的修改。他们通常使用的方法是先使用ILDASM反汇编，使用Perl脚本修改反汇编代码，然后再使用ILASM重新生成互操作程序集。为了解决这个问题，我们引入了一个新功能，允许用户以非常自由的方式来定义他们最终想要看到的结果。&lt;/p&gt;  &lt;p&gt;让我们先来看一个简单的例子：假设我们希望改变互操作程序集中的某个类型的名称。先双击打开TlbImpConfigFileEditor.exe启动自定义文件的编辑器，然后打开我们需要自定义的Type Library，这里我们选择发布版本中Samples\ChangeManagedName\ChangeManagedNameSample.tlb文件，如下：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image002_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image002_thumb.jpg" width="578" height="350" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;左边显示的是我们需要自定义的Type Library，而右边，则是我们需要自定义的规则，这些规则可以告诉TlbImp如何修改最终生成的互操作程序集。首先，将我们需要修改的IComparable接口结点从左边拖到右边，松开鼠标，出现如下的对话框：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image004_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image004_thumb.jpg" width="561" height="336" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;上面这个对话框是用来创建一个新的规则，规则指定TlbImp对于哪些对象应用何种动作。在这个对话框中我们需要定义这个规则所对应的动作（Action），因此需要在Action下拉框中选择ChangeManagedName，然后点击OK即可。之后编辑器状态如下（需要自己展开结点）：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image006_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image006_thumb.jpg" width="741" height="347" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;大家可以看到右边已经出现了一个新的规则叫做Change interface name，对应的Category是Type，也就是说这个规则是针对互操作程序集中的类型设置的。Condition指定了规则所需要满足的条件，选中Condition节点（或者其子节点）可以在下面的Condition Expression中看到对应的规则表达式，也就是NativeName Equal ‘ICompareable’，意思是该规则是针对任何名字叫做IComparable的类型。注意因为我们是从IComparable节点直接拖到右边，因此这些条件是编辑器自动生成的。大家如果需要也可以自己通过点击Native Equal IComparable条件来修改，或者点击&amp;lt;Empty&amp;gt;来增加新的条件。现在我们可以点击&amp;lt;Empty&amp;gt;节点，在下拉框中选择TypeKind，第二个下拉框选择Equal，第三个下拉框选择Interface，最终的结果如下：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image008_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image008_thumb.jpg" width="865" height="350" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;注意表达式节点的组织方式是类似语法树的样子，也就是说And节点下面的互相之间是And关系，最终的结果总是可以在Condition Expression一栏看到：&lt;/p&gt;  &lt;p&gt;( NativeName Equal 'IComparable' ) And ( TypeKind Equal 'Interface')&lt;/p&gt;  &lt;p&gt;当编辑好了规则的时候，我们需要指定对应的具体动作的参数。因为我们需要修改对象类型的名称，双击Action下面的NewName子结点会弹出如下对话框：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image010_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image010" border="0" alt="clip_image010" src="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image010_thumb.jpg" width="373" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;输入我们想修改成的名字，然后点击OK。&lt;/p&gt;  &lt;p&gt;这样一个规则就完成了：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image012_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image012" border="0" alt="clip_image012" src="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image012_thumb.jpg" width="416" height="261" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;修改完毕之后存盘为ChangeInterfaceName.xml，然后在命令行下面调用TlbImp，使用/config参数引用之前存盘的Config文件（黄色加亮部分：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image014_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image014" border="0" alt="clip_image014" src="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image014_thumb.jpg" width="244" height="42" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;之后通过ILDASM打开我们生成的结果：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image016_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image016" border="0" alt="clip_image016" src="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image016_thumb.jpg" width="386" height="199" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;可以看到IComparable已经被改名成了IMyInterface。&lt;/p&gt;  &lt;p&gt;TlbImp总共支持下面几种动作（Action）：&lt;/p&gt;  &lt;p&gt;1. ChangeManagedName：修改类型、函数的名称&lt;/p&gt;  &lt;p&gt;2. ResolveTo：将一个类型替换为另外一个类型（可以是另外一个程序集的类型）。现在已经有用户在CodePlex上面提出这个功能需求了：&lt;a href="http://clrinterop.codeplex.com/WorkItem/View.aspx?WorkItemId=2565"&gt;http://clrinterop.codeplex.com/WorkItem/View.aspx?WorkItemId=2565&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;3. AddAttribute：为任意类型添加任意Attribute&lt;/p&gt;  &lt;p&gt;4. PreserveSig：为单个函数或者类型中的所有函数添加PreserveSigAttribute并相应修改函数的原型&lt;/p&gt;  &lt;p&gt;5. ConvertTo：修改函数中的参数类型&lt;/p&gt;  &lt;p&gt;每种对应的动作在Samples目录下面都有对应的例子，有兴趣的朋友可以参照文档自行实验。&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;回归测试工具&lt;/u&gt;&lt;/b&gt;&lt;b&gt;&lt;u&gt;&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;为了帮助用户在修改TlbImp代码的时候可以更容易保证自己的修改不会引起其他问题，我们引入了一个简单的回归测试工具，大家可以到这里下载：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://clrinterop.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=17579"&gt;http://clrinterop.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=17579&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;下载完毕之后打开Bin目录下面的TlbImpRegressionTestTool.exe，然后通过File菜单打开Testcase目录下面的testcases.xml文件：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image018_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image018" border="0" alt="clip_image018" src="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image018_thumb.jpg" width="752" height="345" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;可以看到所有的Testcase都被列出来了。下一步在Run菜单里面选择Settings，输入TlbImp2.exe和WinDiff.exe所在位置：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image020_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image020" border="0" alt="clip_image020" src="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image020_thumb.jpg" width="497" height="201" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;完毕之后，选择Run下面的Run All Testcases或者Run Selected Testcases，该工具便会调用TlbImp2.exe依次运行Testcase来检查TlbImp2的相应功能是否正确：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image022_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image022" border="0" alt="clip_image022" src="http://blogs.msdn.com/blogfiles/silverlightshanghai/WindowsLiveWriter/CodePlexTlbImp_D953/clip_image022_thumb.jpg" width="752" height="345" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;绿色为测试成功，红色为失败。如果有失败的情况，双击该行可以打开WinDiff比较TlbImp2当前生成的结果和应该生成的结果之间的区别。&lt;/p&gt;  &lt;p&gt;最后，希望大家能够积极试用TlbImp的新功能。如果有希望看到的TlbImp的新功能，或者对目前的TlbImp有哪些觉得做的不够好的地方，都可以到下面的地址提出你的宝贵意见: &lt;a href="http://clrinterop.codeplex.com/WorkItem/List.aspx"&gt;http://clrinterop.codeplex.com/WorkItem/List.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9472815" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/silverlightshanghai/archive/tags/CLR_B065FB95_/default.aspx">CLR新闻</category><category domain="http://blogs.msdn.com/silverlightshanghai/archive/tags/CLR+Interop/default.aspx">CLR Interop</category></item><item><title>在COM应用中使用.NET组件</title><link>http://blogs.msdn.com/silverlightshanghai/archive/2008/07/23/com-net.aspx</link><pubDate>Wed, 23 Jul 2008 17:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8767130</guid><dc:creator>SilverlightShanghai</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/silverlightshanghai/comments/8767130.aspx</comments><wfw:commentRss>http://blogs.msdn.com/silverlightshanghai/commentrss.aspx?PostID=8767130</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT size=3&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;上一博中，我们用&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;Visual Studio&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;把&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;.NET&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;组件&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;(&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;托管组件&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;)&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;变成了&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;COM&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;服务器。本博继续这个话题，看看如何使用&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;.NET&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;工具包来完成相应的功能。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT size=3&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;首先我们来看看今天的主题和&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;CLR Interop&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;的关系，在我们组里，&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;interop&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;这个术语包含了四个范畴，即&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;P/Invoke, Reverse P/Invoke, COM Interop&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;和&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;Reverse COM Interop&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;。前二个概念通过动态连接库&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;(DLL)&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;在&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;native&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;世界和&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;.NET&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;世界中实现互通性；后两个概念顾名思义，就是和&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;COM&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;打交道了。其中，&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;COM interop&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;是在&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;.NET&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;应用中使用&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;COM&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;组件；&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;Reverse COM Interop&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;指的是在&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;COM&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;应用中使用&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;.NET&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;组件。概念有些绕口令，看官先别急着抛转，看看下图。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT size=3&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;IMG style="WIDTH: 531px; HEIGHT: 133px" height=133 src="http://1kbioq.bay.livefilestore.com/y1pJbOPp0B-pzdFBMso4oU4Gce_jPezd6UfxzUDOrI54ysmI7KA96kp39AaimfxmH7-VlTsOHelXNg/f0.jpg" width=531 mce_src="http://1kbioq.bay.livefilestore.com/y1pJbOPp0B-pzdFBMso4oU4Gce_jPezd6UfxzUDOrI54ysmI7KA96kp39AaimfxmH7-VlTsOHelXNg/f0.jpg"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT size=3&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;可能有人会问，&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;&lt;SPAN lang=ZH-CN&gt; &lt;/SPAN&gt;COM&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;技术已经历史悠久了，&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;.NET&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;程序员为什么需要和它打交道呢？问题的答案就在于&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;”&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;组件&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;”&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;一词。举个例子，若干年前一个牛人写了个程序，扩展性极佳，他用了&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;COM&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;把插件的接口定义的明明白白，而我们想用&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;.NET&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;来做这个插件。。。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT size=3&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;为&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;COM&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;写一个&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;.NET&lt;/FONT&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;组件，可以参照以下三部曲&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;SPAN style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;SPAN style="mso-list: Ignore"&gt;&lt;FONT face=Calibri size=3&gt;
&lt;P class=MsoListParagraphCxSpFirst style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1"&gt;&lt;SPAN style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;SPAN style="mso-list: Ignore"&gt;1.&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;定义&lt;/SPAN&gt;.NET&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;接口，撰写&lt;/SPAN&gt;.NET class&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1"&gt;&lt;SPAN style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;SPAN style="mso-list: Ignore"&gt;2.&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;部署&lt;/SPAN&gt;.NET&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;组件&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast style="MARGIN: 0in 0in 10pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1"&gt;&lt;SPAN style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;SPAN style="mso-list: Ignore"&gt;3.&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;撰写&lt;/SPAN&gt;COM&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;客户端&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;第一步骤对经常从事&lt;/SPAN&gt;.NET&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;的开发朋友来说非常熟悉，这里给出例子，不再赘述。&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="BACKGROUND: silver; mso-highlight: silver"&gt;csc /target:library a.cs&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;第二，要部署&lt;/SPAN&gt;.NET&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;组件，这里包括两个方面：&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="BACKGROUND: silver; mso-highlight: silver"&gt;regasm a.dll /tlb&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2"&gt;&lt;SPAN style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;SPAN style="mso-list: Ignore"&gt;1.&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;把类型库&lt;/SPAN&gt;(type library)&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;导出。对于&lt;/SPAN&gt;COM&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;应用来说，它只懂得类型库，是为&lt;/SPAN&gt;COM&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;组件遵循的二进制&lt;/SPAN&gt;”&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;标准&lt;/SPAN&gt;”&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;。&lt;/SPAN&gt;/tlb&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;选项告诉&lt;/SPAN&gt;regasm&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;，导出类型库。我们可以用&lt;/SPAN&gt;oleview&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;察看&lt;/SPAN&gt;tlb&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;的内容，如下图所示，此前定义的&lt;/SPAN&gt;.NET&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;接口和类都在其中。&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2"&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;IMG style="WIDTH: 687px; HEIGHT: 278px" height=278 src="http://1kbioq.bay.livefilestore.com/y1pcY_1XPvdhIffGfofmShcbWzJQjfe66b9fM2BINKtIYy2F2nXADikShyBI82gbihn6_mQb_0IszI/f2.JPG" width=687 mce_src="http://1kbioq.bay.livefilestore.com/y1pcY_1XPvdhIffGfofmShcbWzJQjfe66b9fM2BINKtIYy2F2nXADikShyBI82gbihn6_mQb_0IszI/f2.JPG"&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2"&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast style="MARGIN: 0in 0in 10pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2"&gt;&lt;SPAN style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;SPAN style="mso-list: Ignore"&gt;2.&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;把步骤&lt;/SPAN&gt;2&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;中生成的&lt;/SPAN&gt;dll&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;放到注册表中。&lt;/SPAN&gt;COM&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;并不懂得诸如&lt;/SPAN&gt;GAC&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;的概念，而是通过注册表来查询&lt;/SPAN&gt;HKEY_CLASSES_ROOT\CLS_ID\00000000-0000-0000-FFFF-000000000004&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;，观察这个注册表项，&lt;/SPAN&gt;InprocServer32&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;中把&lt;/SPAN&gt;COM&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;的动态链接库指向了&lt;/SPAN&gt;mscoree.dll&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;，这就是传说中的垫片&lt;/SPAN&gt;(shim)&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;，它会负责加载公共语言运行时，并找到真正的&lt;/SPAN&gt;.NET&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;组件&lt;/SPAN&gt;----a.dll&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;。&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast style="MARGIN: 0in 0in 10pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2"&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&amp;nbsp;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;IMG style="WIDTH: 720px; HEIGHT: 183px" height=183 src="http://1kbioq.bay.livefilestore.com/y1pcY_1XPvdhIcd9HmhsrCfp7qoXRkKIc0u6267NI9vldgGkILgmf6I0RaRRTcIK51AxSLaHXEf_OM/f1.jpg" width=720 mce_src="http://1kbioq.bay.livefilestore.com/y1pcY_1XPvdhIcd9HmhsrCfp7qoXRkKIc0u6267NI9vldgGkILgmf6I0RaRRTcIK51AxSLaHXEf_OM/f1.jpg"&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;有了以上两步，我们就可以在&lt;/SPAN&gt;COM&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;应用中使用&lt;/SPAN&gt;.NET&lt;SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;组件了。如何撰写COM组件超出了本文的范畴，有兴趣的读者可以参考代码中的注释。&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="BACKGROUND: silver; mso-highlight: silver"&gt;cl client.cs&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;// client.cs&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;#define&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; _WIN32_COM&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;#include&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; &lt;SPAN style="COLOR: #a31515"&gt;&amp;lt;stdio.h&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;#include&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; &lt;SPAN style="COLOR: #a31515"&gt;&amp;lt;wtypes.h&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;#import&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; &lt;SPAN style="COLOR: #a31515"&gt;"a.tlb"&lt;/SPAN&gt; no_namespace named_guids raw_interfaces_only&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;// a.tlb&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: SimSun; mso-ascii-font-family: 'Courier New'; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"&gt;是第二步中导出的&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;int&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; main()&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;IUnknown *pUnk = NULL;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;IA *pIA = NULL;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;HRESULT hresult;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// 0. &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: SimSun; mso-ascii-font-family: 'Courier New'; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"&gt;初始化&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;COM&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: SimSun; mso-ascii-font-family: 'Courier New'; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"&gt;组件&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;hresult = CoInitializeEx(NULL, COINIT_MULTITHREADED);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (FAILED(hresult))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;printf(&lt;SPAN style="COLOR: #a31515"&gt;"ERROR: cannot initialze COM: 0x%x\n"&lt;/SPAN&gt;, hresult);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; -1;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// 1. &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: SimSun; mso-ascii-font-family: 'Courier New'; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"&gt;获取&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;IUnknown&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: SimSun; mso-ascii-font-family: 'Courier New'; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"&gt;接口&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;hresult = CoCreateInstance(CLSID_A, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; **)&amp;amp;pUnk);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (FAILED(hresult))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;printf(&lt;SPAN style="COLOR: #a31515"&gt;"ERROR: cannot Get the IUnkown interface: 0x%x\n"&lt;/SPAN&gt;, hresult);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; -1;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// 2. &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: SimSun; mso-ascii-font-family: 'Courier New'; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"&gt;获得&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;IA&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: SimSun; mso-ascii-font-family: 'Courier New'; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"&gt;接口&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;hresult = pUnk-&amp;gt;QueryInterface(IID_IA, (&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; **)&amp;amp;pIA);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (FAILED(hresult))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;printf(&lt;SPAN style="COLOR: #a31515"&gt;"ERROR: cannot Convert to IDispatch interface: 0x%x\n"&lt;/SPAN&gt;, hresult);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;pUnk-&amp;gt;Release();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; -1;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;pUnk-&amp;gt;Release();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// 3. &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: SimSun; mso-ascii-font-family: 'Courier New'; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"&gt;调用&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;.NET&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: SimSun; mso-ascii-font-family: 'Courier New'; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"&gt;组件&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;hresult = pIA-&amp;gt;Hello();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (FAILED(hresult))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;printf(&lt;SPAN style="COLOR: #a31515"&gt;"ERROR: Invoke failed: 0x%x\n"&lt;/SPAN&gt;, hresult);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// 4. &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: SimSun; mso-ascii-font-family: 'Courier New'; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"&gt;清理&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;pIA-&amp;gt;Release();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;CoUninitialize();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; 0;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1"&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; By com.microsoft.stbc.devdiv.ndp.interop.dev/mountaintai&lt;/SPAN&gt;&lt;SPAN lang=ZH-CN style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;二世&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8767130" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/silverlightshanghai/archive/tags/CLR+Interop/default.aspx">CLR Interop</category></item><item><title>使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法</title><link>http://blogs.msdn.com/silverlightshanghai/archive/2008/07/22/idispatch-invoke-c-c.aspx</link><pubDate>Tue, 22 Jul 2008 07:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8763116</guid><dc:creator>SilverlightShanghai</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/silverlightshanghai/comments/8763116.aspx</comments><wfw:commentRss>http://blogs.msdn.com/silverlightshanghai/commentrss.aspx?PostID=8763116</wfw:commentRss><description>&amp;nbsp; 
&lt;P&gt;CLR Interop简而言之是让非托管代码与托管代码之间可以相互调用的技术。这项技术可以使开发人员重用已有的托管或非托管组建，并根据自己的需要，权衡托管代码的简易性与非托管代码的灵活性，选择适合自己实际情况的编程语言，而不用过多考虑重用的组件是用哪种语言开发的。Interop中文的意思是互通性，既然是互通，代码的调用就有两种不同的方向。本文所要讲述的是使用COM Interop技术在非托管代码方如何调用托管代码。&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&lt;STRONG&gt;1. 创建托管服务器&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;首先让我们在Visual Studio 2008创建一个C#的Class Library（类库）项目，取名为MyManagedServer，在该项目中，我们要声明并实现一个接口。&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 12pt"&gt;&lt;FONT style="FONT-SIZE: 11pt" face=Arial&gt;接口声明代码如下：&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt"&gt;&lt;FONT face=Arial&gt;为了说明简单，该接口中只有一个方法，用于打印一些信息。其中的ComVisible属性至关重要，当它的值为true时，该接口才对COM可见。&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=Arial&gt;
&lt;DIV class=dp-highlighter&gt;
&lt;DIV class=bar&gt;
&lt;DIV class=tools&gt;&lt;A onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#" mce_href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#"&gt;&lt;FONT color=#a0a0a0&gt;view plain&lt;/FONT&gt;&lt;/A&gt;&lt;A onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#" mce_href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#"&gt;&lt;FONT color=#a0a0a0&gt;copy to clipboard&lt;/FONT&gt;&lt;/A&gt;&lt;A onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#" mce_href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#"&gt;&lt;FONT color=#a0a0a0&gt;print&lt;/FONT&gt;&lt;/A&gt;&lt;A onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#" mce_href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#"&gt;&lt;FONT color=#a0a0a0&gt;?&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;OL class=dp-c&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;using&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;System; &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;using&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;System.Runtime.InteropServices; &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;namespace&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;MyManagedServer &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;{ &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ComVisible(&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;true&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;), &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Guid(&lt;/SPAN&gt;&lt;SPAN class=string&gt;&lt;FONT color=#0000ff&gt;"79EDDA1C-F243-47C5-8954-5DEF01FA3D44"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;), &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InterfaceType(ComInterfaceType.InterfaceIsDual)]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;public&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;interface&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;IManagedFooClass &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[PreserveSig,&amp;nbsp;DispId(1)] &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;void&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;PrintFoo(); &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;&lt;PRE class=Csharp style="DISPLAY: none" name="code"&gt;using System;
using System.Runtime.InteropServices;

namespace MyManagedServer
{
    [ComVisible(true),
     Guid("79EDDA1C-F243-47C5-8954-5DEF01FA3D44"),
     InterfaceType(ComInterfaceType.InterfaceIsDual)]     
    public interface IManagedFooClass
    {
        [PreserveSig, DispId(1)]
        void PrintFoo();
    }
}&lt;/PRE&gt;&lt;/FONT&gt;
&lt;P style="FONT-SIZE: 12pt"&gt;&lt;FONT style="FONT-SIZE: 11pt" face=Arial&gt;接下来是实现该接口的类：&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=dp-highlighter&gt;
&lt;DIV class=bar&gt;
&lt;DIV class=tools&gt;&lt;A onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#" mce_href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#"&gt;&lt;FONT color=#a0a0a0&gt;view plain&lt;/FONT&gt;&lt;/A&gt;&lt;A onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#" mce_href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#"&gt;&lt;FONT color=#a0a0a0&gt;copy to clipboard&lt;/FONT&gt;&lt;/A&gt;&lt;A onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#" mce_href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#"&gt;&lt;FONT color=#a0a0a0&gt;print&lt;/FONT&gt;&lt;/A&gt;&lt;A onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#" mce_href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#"&gt;&lt;FONT color=#a0a0a0&gt;?&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;OL class=dp-c&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;using&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;System; &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;using&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;System.Runtime.InteropServices; &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;namespace&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;MyManagedServer &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;{ &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ComVisible(&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;true&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;), &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ClassInterface(ClassInterfaceType.AutoDual), &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProgId(&lt;/SPAN&gt;&lt;SPAN class=string&gt;&lt;FONT color=#0000ff&gt;"MyManagedServer.ManagedFooClass"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;) &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;] &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;public&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;class&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;CustomCOMClient&amp;nbsp;:&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IManagedFooClass,&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IManagedBarClass &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;public&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;CustomCOMClient() &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/SPAN&gt;&lt;SPAN class=preprocessor&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&lt;SPAN class=preprocessor&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&lt;SPAN class=preprocessor&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region&amp;nbsp;IManagedFooClass&amp;nbsp;Members &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DispId(1)] &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;public&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;void&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;PrintFoo() &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;/SPAN&gt;&lt;SPAN class=string&gt;&lt;FONT color=#0000ff&gt;"in&amp;nbsp;MyManagedServer:&amp;nbsp;CustomCOMClient.PrintFoo()"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;); &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/SPAN&gt;&lt;SPAN class=preprocessor&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&lt;SPAN class=preprocessor&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&lt;SPAN class=preprocessor&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;&lt;PRE class=Csharp style="DISPLAY: none" name="code"&gt;using System;
using System.Runtime.InteropServices;

namespace MyManagedServer
{
    [ComVisible(true),
     ClassInterface(ClassInterfaceType.AutoDual),
     ProgId("MyManagedServer.ManagedFooClass")
    ]
    public class CustomCOMClient : IManagedFooClass, IManagedBarClass
    {
        public CustomCOMClient()
        {
        }
        
        #region IManagedFooClass Members

        [DispId(1)]
        public void PrintFoo()
        {
            Console.WriteLine("in MyManagedServer: CustomCOMClient.PrintFoo()");
        }

        #endregion
    }
}&amp;nbsp;&lt;/PRE&gt;
&lt;P style="FONT-SIZE: 12pt"&gt;&lt;FONT style="FONT-SIZE: 11pt" face=Arial&gt;这里我们给这个类的ProgId属性赋一个值。等会儿在注册组件的时候，注册表中将会增加一个键值，将ProgId和runtime为我们自动生成的CLSID关联起来。&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 12pt"&gt;&lt;STRONG style="FONT-SIZE: 11pt"&gt;&lt;FONT face=Arial&gt;2. 为COM Interop注册托管服务组件&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt"&gt;&lt;FONT face=Arial&gt;注册组件可以用Visual Studio帮我们自动注册，也可以在命令行下手动输入命令。若要使用Visual Studio来帮我们注册组件，只需在项目属性页（鼠标右键项目名称，在下拉菜单中选择“Properties（属性）”）的Build标签页中把Register for COM Interop项打上勾，然后再build项目就可以了。如下图所示：&lt;/FONT&gt;&lt;/P&gt;&lt;IMG height=594 alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/SilverlightShanghai/EntryImages/20080721/Register%20for%20COM%20Interop.png" width=780 mce_src="http://p.blog.csdn.net/images/p_blog_csdn_net/SilverlightShanghai/EntryImages/20080721/Register%20for%20COM%20Interop.png"&gt; 
&lt;P style="FONT-SIZE: 11pt"&gt;&lt;FONT face=Arial&gt;此外，我们也可以先build项目，然后通过命令行的方式注册组件。只需要使用&lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/tzat5yw6(VS.71).aspx" mce_href="http://msdn.microsoft.com/en-us/library/tzat5yw6(VS.71).aspx"&gt;&lt;FONT face=Arial color=#006bad&gt;regasm.exe&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial&gt;在VS2008命令行下输入如下命令即可：&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 12pt"&gt;&lt;STRONG&gt;&lt;FONT face=Arial&gt;regasm assemblyname.dll /tlb /codebase&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 12pt"&gt;&lt;FONT style="FONT-SIZE: 11pt" face=Arial&gt;该命令会为我们注册组件，生成并注册对应的type library文件。其中assemblyname.dll是项目构建生成的程序集文件。&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 12pt"&gt;&lt;STRONG style="FONT-SIZE: 11pt"&gt;3. 创建非托管客户端&lt;/P&gt;&lt;/STRONG&gt;
&lt;P style="FONT-SIZE: 11pt"&gt;&lt;FONT face=Arial&gt;使用托管语言创建并注册了组建之后，我们就要使用非托管语言来尝试通过COM Interop调用组建中的方法了。首先，在Visual Studio 2008中创建一个Visual C++ Win32 Console Application，取名为MyNatvieClient，并将组建生成tlb文件拷贝至该项目的源代码目录中。然后在MyNativeClient.cpp中输入如下代码：&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=dp-highlighter&gt;
&lt;DIV class=bar&gt;
&lt;DIV class=tools&gt;&lt;A onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#" mce_href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#"&gt;&lt;FONT color=#a0a0a0&gt;view plain&lt;/FONT&gt;&lt;/A&gt;&lt;A onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#" mce_href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#"&gt;&lt;FONT color=#a0a0a0&gt;copy to clipboard&lt;/FONT&gt;&lt;/A&gt;&lt;A onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#" mce_href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#"&gt;&lt;FONT color=#a0a0a0&gt;print&lt;/FONT&gt;&lt;/A&gt;&lt;A onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#" mce_href="http://blog.csdn.net/SilverlightShanghai/archive/2008/07/15/2654314.aspx#"&gt;&lt;FONT color=#a0a0a0&gt;?&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;OL class=dp-c&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&lt;FONT color=#808080&gt;&lt;SPAN class=preprocessor&gt;#include&amp;nbsp;"stdafx.h" &lt;/SPAN&gt;&lt;SPAN class=preprocessor&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&lt;SPAN class=preprocessor&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&lt;FONT color=#808080&gt;&lt;SPAN class=preprocessor&gt;#import&amp;nbsp;"mscorlib.tlb"&amp;nbsp;no_namespace &lt;/SPAN&gt;&lt;SPAN class=preprocessor&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&lt;SPAN class=preprocessor&gt;&lt;FONT color=#808080&gt;#import&amp;nbsp;"MyManagedServer.tlb"&amp;nbsp;no_namespace &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;int&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;_tmain(&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;int&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;argc,&amp;nbsp;_TCHAR*&amp;nbsp;argv[]) &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;{ &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;::CoInitialize(NULL); &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=comment&gt;&lt;FONT color=#008200&gt;//&amp;nbsp;Get&amp;nbsp;CLSID&amp;nbsp;for&amp;nbsp;CoCreateInstance &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;const&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;OLECHAR&amp;nbsp;lpszProgID[]&amp;nbsp;=&amp;nbsp;OLESTR(&lt;/SPAN&gt;&lt;SPAN class=string&gt;&lt;FONT color=#0000ff&gt;"MyManagedServer.ManagedFooClass"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;); &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CLSID&amp;nbsp;clsid;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HRESULT&amp;nbsp;hr&amp;nbsp;=&amp;nbsp;CLSIDFromProgID(lpszProgID,&amp;nbsp;&amp;amp;clsid); &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;if&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;(SUCCEEDED(hr)) &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/SPAN&gt;&lt;SPAN class=string&gt;&lt;FONT color=#0000ff&gt;"CLSIDFromProgID&amp;nbsp;Succeeded&amp;nbsp;\n"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;); &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IDispatch*&amp;nbsp;ppv&amp;nbsp;=&amp;nbsp;0;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HRESULT&amp;nbsp;hr&amp;nbsp;=&amp;nbsp;CoCreateInstance(clsid,&amp;nbsp;NULL,&amp;nbsp;CLSCTX_ALL,&amp;nbsp;IID_IDispatch,&amp;nbsp;(&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;void&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;**)&amp;amp;ppv); &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;if&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;(SUCCEEDED(hr)) &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/SPAN&gt;&lt;SPAN class=string&gt;&lt;FONT color=#0000ff&gt;"CoCreateInstance&amp;nbsp;Succeeded&amp;nbsp;\n"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;); &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=comment&gt;&lt;FONT color=#008200&gt;//&amp;nbsp;Get&amp;nbsp;DispId&amp;nbsp;for&amp;nbsp;Invoke &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DISPID&amp;nbsp;dispid; &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;const&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;LPOLESTR&amp;nbsp;szMember&amp;nbsp;=&amp;nbsp;OLESTR(&lt;/SPAN&gt;&lt;SPAN class=string&gt;&lt;FONT color=#0000ff&gt;"PrintFoo"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;); &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HRESULT&amp;nbsp;hr&amp;nbsp;=&amp;nbsp;ppv-&amp;gt;GetIDsOfNames(IID_NULL,&amp;nbsp;(LPOLESTR*)&amp;amp;szMember,1,LOCALE_SYSTEM_DEFAULT,&amp;amp;dispid); &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;if&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;(SUCCEEDED(hr)) &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/SPAN&gt;&lt;SPAN class=string&gt;&lt;FONT color=#0000ff&gt;"GetIDsOfNames&amp;nbsp;Succeeded&amp;nbsp;\n"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;); &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=comment&gt;&lt;FONT color=#008200&gt;//&amp;nbsp;There&amp;amp;apos;s&amp;nbsp;no&amp;nbsp;parameter&amp;nbsp;to&amp;nbsp;pass &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DISPPARAMS&amp;nbsp;dispParams&amp;nbsp;=&amp;nbsp;{0}; &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VARIANT&amp;nbsp;vtResult; &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UINT&amp;nbsp;dwArgErr; &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HRESULT&amp;nbsp;hr&amp;nbsp;=&amp;nbsp;ppv-&amp;gt;Invoke(dispid,IID_NULL,NULL,DISPATCH_METHOD,&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;dispParams,&amp;amp;vtResult,NULL,&amp;amp;dwArgErr); &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;if&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;(SUCCEEDED(hr)) &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/SPAN&gt;&lt;SPAN class=string&gt;&lt;FONT color=#0000ff&gt;"Invoke&amp;nbsp;Succeeded&amp;nbsp;\n"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;); &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ppv-&amp;gt;Release(); &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=alt&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=keyword&gt;&lt;STRONG&gt;&lt;FONT color=#006699&gt;return&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;0; &amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=""&gt;&lt;SPAN&gt;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;&lt;PRE class=Csharp style="DISPLAY: none" name="code"&gt;#include "stdafx.h"

#import "mscorlib.tlb" no_namespace
#import "MyManagedServer.tlb" no_namespace

int _tmain(int argc, _TCHAR* argv[])
{

	::CoInitialize(NULL);

	// Get CLSID for CoCreateInstance
	const OLECHAR lpszProgID[] = OLESTR("MyManagedServer.ManagedFooClass");
	CLSID clsid;	
	HRESULT hr = CLSIDFromProgID(lpszProgID, &amp;amp;clsid);
	if(SUCCEEDED(hr))
	{
		printf("CLSIDFromProgID Succeeded \n");
		IDispatch* ppv = 0;	
		HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IDispatch, (void**)&amp;amp;ppv);

		if(SUCCEEDED(hr))
		{
			printf("CoCreateInstance Succeeded \n");

			// Get DispId for Invoke
			DISPID dispid;
			const LPOLESTR szMember = OLESTR("PrintFoo");
			HRESULT hr = ppv-&amp;gt;GetIDsOfNames(IID_NULL, (LPOLESTR*)&amp;amp;szMember,1,LOCALE_SYSTEM_DEFAULT,&amp;amp;dispid);
			if(SUCCEEDED(hr))
			{
				printf("GetIDsOfNames Succeeded \n");

				// There&amp;amp;apos;s no parameter to pass
				DISPPARAMS dispParams = {0};
				VARIANT vtResult;
				UINT dwArgErr;

				HRESULT hr = ppv-&amp;gt;Invoke(dispid,IID_NULL,NULL,DISPATCH_METHOD,&amp;amp;dispParams,&amp;amp;vtResult,NULL,&amp;amp;dwArgErr);
				if(SUCCEEDED(hr))
				{
					printf("Invoke Succeeded \n");
				}
			}

			ppv-&amp;gt;Release();
		}
	}

	return 0;
}&lt;/PRE&gt;
&lt;P style="FONT-SIZE: 11pt"&gt;&lt;FONT face=Arial&gt;该代码主要做了以下几件事情：&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt"&gt;&lt;FONT face=Arial&gt;a. 调用&lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms678543(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms678543(VS.85).aspx"&gt;&lt;FONT face=Arial color=#006bad&gt;CoInitialize&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial&gt;进行初始化。&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt"&gt;&lt;FONT face=Arial&gt;b. 调用&lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms688386.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms688386.aspx"&gt;&lt;FONT face=Arial color=#006bad&gt;CLSIDFromProgId&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial&gt;获得对象的CLSID，因为接下来的函数将通过CLSID来创建实例。&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt"&gt;&lt;FONT face=Arial&gt;c. 通过&lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms686615.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms686615.aspx"&gt;&lt;FONT face=Arial color=#006bad&gt;CoCreateInstance&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial&gt;创建对象实例。这里创建的是一个IDispatch的对象实例。&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt"&gt;&lt;FONT face=Arial&gt;d. 调用&lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms221306(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms221306(VS.85).aspx"&gt;&lt;FONT face=Arial color=#006bad&gt;IDispatch::GetIDsOfNames&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial&gt;以获得将要调用的方法的DispID，供接下来的函数使用。&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt"&gt;&lt;FONT face=Arial&gt;e. 使用&lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms221479(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms221479(VS.85).aspx"&gt;&lt;FONT face=Arial color=#006bad&gt;IDispatch::Invoke&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial&gt;来调用方法。&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt"&gt;&lt;FONT face=Arial&gt;在import type library的时候我们不仅import了组建的tlb文件，同时还import了mscorlib.tlb以避免生成的临时的tlh文件中一些类型找不到的情况。（有关此方面的问题可以参考我们团队开发人员张羿撰写的《&lt;/FONT&gt;&lt;A href="http://blogs.msdn.com/yizhang/archive/2008/03/05/import-net-dll-tlb.aspx" mce_href="http://blogs.msdn.com/yizhang/archive/2008/03/05/import-net-dll-tlb.aspx"&gt;&lt;FONT face=Arial color=#006bad&gt;#import从.NET DLL生成的tlb的神秘错误&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial&gt;》）&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt"&gt;&lt;FONT face=Arial&gt;编译通过后运行结果，可看到命令行中打印出如下信息：&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 12pt"&gt;&lt;FONT style="FONT-SIZE: 11pt" face=Arial&gt;CLSIDFromProgID Succeeded&lt;BR&gt;CoCreateInstance Succeeded&lt;BR&gt;GetIDsOfNames Succeeded&lt;BR&gt;in MyManagedServer: CustomCOMClient.PrintFoo()&lt;BR&gt;Invoke Succeeded&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 12pt"&gt;&lt;FONT style="FONT-SIZE: 9pt" face=Arial&gt;注：本文所示代码只作为实例使用。本文作者不对因代码使用不当而造成的问题负责。v&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8763116" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/silverlightshanghai/archive/tags/CLR+Interop/default.aspx">CLR Interop</category></item></channel></rss>