VC++代码(涉及COM概念)转C#时,COM与C Sharp是如何关联的?

问题描述 投票:0回答:2

我对 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 对我来说是一个陌生的概念,如果我提出一些愚蠢的疑问或毫无意义的疑问,请抱歉..

提前致谢..

c# visual-c++ com
2个回答
2
投票

大写标识符是宏,它们确保 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 了。


0
投票

如果您在项目中添加 com 引用(或使用 TLBIMP 导入),大部分内容都会自动处理。

S_OK 和 S_FAIL 转换为异常。请参阅MSDN

© www.soinside.com 2019 - 2024. All rights reserved.