我对 C# 和 C++ 有很好的了解。但我对 COM 编程完全陌生。我正在将一些代码从 VC++ 转换为 C#。但是 VC++ 代码涉及很多 COM 关键字,如
STDMETHODIMP
、STDMETHODCALLTYPE
、__declspec
、HRESULT
以及其他 COM 编程概念。我不明白这些 COM 术语是什么。
但是由于我可以理解 C++,所以我能够理解 VC++ 代码中涉及的逻辑,并将该逻辑转换为 C# 实现,而忽略 COM 术语。
我的 VC++ 代码中的某些函数具有返回类型
STDMETHODIMP
,并且它们只是返回 S_OK
或 E_FAIL
等。我该如何继续转换为 C#?对于这些返回 S_OK
E_FAIL
的 VC++ 函数,我应该在 C# 代码中返回什么,以及我应该在 C# 代码中使用什么返回类型而不是 STDMETHODIMP
?
事实上,我的 VC++ 代码中有很多这样的 COM 术语,如“
skippedEntity()
”、“processingInstruction()
”等。事实上,这个 VC++ 代码正在使用一个名为“msxml6.dll
”的 DLL。并实现其中的接口方法。那么,如果我忽略这些 COM 术语并继续将 VC++ 代码中涉及的逻辑实现为 C# 可以吗?
请告诉我同样的信息..
由于 COM 对我来说是一个陌生的概念,如果我提出一些愚蠢的疑问或毫无意义的疑问,请抱歉..
提前致谢..
大写标识符是宏,它们确保 COM 接口函数具有正确的签名。与自动化兼容的 COM 函数必须使用正确的调用约定 __stdcall,并且必须返回指示错误或成功状态的 long(hresult)。其他要求是 COM 接口必须实现 IUnknown,并且函数参数类型应将自身限制为自动化兼容类型。
CLR 中的 COM 互操作支持可确保满足这些要求。它为自动实现 IUnknown 的 C# 接口生成一个 v-table,您不必自己实现它。 HRESULT 返回值是自动生成的,它是从异常映射的。函数参数会自动从其非托管类型编组为等效的本机类型。
论证类型翻译是一个相当大的主题,任何关于该主题的像样的书(例如 Adam Nathan 的书)都有介绍。可以说任何自动化兼容类型都有相应的托管类型。更难的是 VARIANT 的对象、BSTR 的字符串和 SAFEARRAY 的数组。
您可以使用 C# 中的 [ComVisible] 属性来创建 COM 服务器。其他几个相关的,如 [Guid] 和 [InterfaceType]。任何示例都很好地涵盖了这一点。您可以使用 Tlbexp.exe 创建类型库,或者更常见的是使用 Regasm.exe /tlb。后一个工具是注册服务器所需的工具,您不能再使用 Regsvr32.exe 了。
如果您在项目中添加 com 引用(或使用 TLBIMP 导入),大部分内容都会自动处理。
S_OK 和 S_FAIL 转换为异常。请参阅MSDN。