2010-11-10 29 views
1

我对C sharp和C++有很好的了解。但我对COM编程完全陌生。我将一些代码从VC++转换为C#。但是VC++代码涉及到很多COM关键字像STDMETHODIMPSTDMETHODCALLTYPE__declspecHRESULT,和其他COM编程概念。我没有得到什么是这些COM terminilogies。 但是由于我能理解C++,因此我能够理解VC++代码中涉及的逻辑,并将此逻辑转换为C#实现IGNORING COM术语。
在我的VC++代码,某些功能受到具有返回类型STDMETHODIMP,他们只是返回S_OKE_FAIL等。怎能与我转换到C夏普继续吗?我应该在我的C#代码中返回这些返回S_OK E_FAIL的VC++函数,以及我应该在C#代码中使用的返回类型,而不是STDMETHODIMP。 ?事实上,在我的VC++代码中有很多这样的COM术语,比如“skippedEntity()”“processingInstruction()”等。事实上,这个VC++代码正在利用名为“msxml6.dll”的DLL。并在其中实现接口方法。那么,如果我忽略这些COM术语并继续将VC++代码中的逻辑实现为C#,那么可以吗?
请让我知道同..在将VC++代码(涉及COM概念)转换为C#时,COM如何与C Sharp相关联?

由于COM是一个陌生的概念对我来说,对不起,如果我问一些愚蠢的疑问或无意义的疑问..

在此先感谢..

回答

2

大写标识符是宏,它们确保COM接口函数具有正确的签名。与自动化兼容的COM函数必须使用正确的调用约定__stdcall,并且必须返回指示错误或成功状态的long(hresult)。其他要求是COM接口必须实现IUnknown,并且函数参数类型应该将自身限制为自动化兼容类型。

CLR中的COM互操作支持确保满足这些要求。它为一个自动实现IUnknown的C#接口生成一个v-表,你不必自己实现它。 HRESULT返回值是自动生成的,它从异常映射。函数参数会从它们的非托管类型自动封送到等效的本机类型。

参数类型翻译是一个相当大的话题,并在任何有关该主题的像样的书(如Adam Nathan's)中涵盖。只要说任何兼容自动化的类型都有相应的托管类型即可。更难的是反对VARIANT,串到BSTR和数组SAFEARRAY。

您在C#中使用[ComVisible]属性来创建COM服务器。其他几个是相关的,如[Guid]和[InterfaceType]。这在任何例子中都有很好的介绍。您可以使用Tlbexp.exe或更常用的Regasm.exe/tlb创建类型库。后一种工具是注册服务器所需的工具,您不能再使用Regsvr32.exe。

0

大多数如果您在项目中添加com-reference(或使用TLBIMP导入),则会自动处理这些内容。

S_OK和S_FAIL被转换为例外。见MSDN