COM的put_XXX方法是否在.NET RCW中更改为set_XXX

时间:2014-05-22 11:04:46

标签: com wrapper rcw

我有一个COM组件,里面有get_XXX和put_XXX方法。我在.NET项目中使用它,并为它生成了RCW。我现在看到get_XXX和set_XXX方法而不是put_XXX方法?这是自动的还是在IDL的某个地方定义的?

2 个答案:

答案 0 :(得分:4)

这些是属性访问器方法。当客户端程序在写入时读取属性put_Xxx()时,使用COM服务器的编译器会生成对get_Xxx()的调用。 C#完全不具备的特殊功能是putref_Xxx(),用于明确访问对象而不是值。

Tlbimp.exe执行的正常翻译是一个简单的C#属性。但这并不总是有效,C#对属性的外观要严格得多:

  • 默认属性,注释为DISPID_VALUE(dispid 0)的属性必须使单个参数兼容。这映射到C# indexer property,使其看起来像是在索引数组。
  • 任何其他属性都不能参数,C#不支持索引器以外的索引属性。
  • C#没有相应的putref_Xxx(),由于前两个项目符号,在C#程序中不会出现语法歧义。而C#团队决定实施这些限制的核心原因是,他们非常不喜欢这种语言的含糊不清。

因此Tlbimp.exe被迫处理这些限制,如果COM属性访问器不兼容,那么必须回退到将它们作为普通方法而不是属性公开。使用默认名称,他们将获得get_set_前缀。后者解释了你的问题,他们没有选择put_因为原因不明确。

值得注意的是,C#版本4放宽了其中的一些限制,最重要的是使Office程序的互操作更容易。温和地说,在早期的C#版本中,这是非常痛苦的。它扩展了属性语法以减轻痛苦,但仅限于COM互操作。非常强烈建议如果您仍然坚持使用旧版本的.NET,现在是考虑更新的好时机。

答案 1 :(得分:3)

属性本身必须有前缀(put_等),它们有名称,getter方法,setter方法,但没有前缀。从类型库生成的方法表接收前缀以区分getter和setter,从而区分前缀。前缀字符串完全取决于生成名称的人的首选项。

另见:

  

默认情况下,低级propget,propput和propputref方法由分别以get_,put_和putref_为前缀命名的成员函数公开。这些前缀与MIDL生成的头文件中使用的名称兼容。