代码的链接在《用C#编写一个进程外的COM组件》,小技巧:如果你要同时看示例代码和讲解的话,可以用浏览器分别打开示例代码和这篇文章,然后使用Windows提供的纵向平铺窗口功能就可同时看两篇文章了。
TestComVisibleClass.cs里面定义了我们要发布给COM客户程序的.NET对象,由于我们的.NET进程外组件需要调用几个COM库的API,因此在ComHelperClass里面定义这些API在.NET里面的声明方式,正确地声明P/Invoke函数的原型非常困难,要求程序员对Win32,COM和托管代码都很熟悉才可以做,所以我写了另外一篇文章《使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明》简化P/Invoke函数声明的步骤。
ComHelperClass类里面CoRegisterClassObject函数的原型比较有意思,注意rclsid参数前面的[MarshalAs(UnmanagedType.LPStruct)]属性,这个属性告诉.NET,在从.NET一端传递rclsid参数值到非托管代码一端时,不要使用默认的列集(Marshal)规则,在P/Invoke里面,NET默认将结构体对象完整复制到非托管的内存里,使用UnmanagedType.LPStruct告诉NET将Guid