我有一个COM组件,里面有get_XXX和put_XXX方法。我在.NET项目中使用它,并为它生成了RCW。我现在看到get_XXX和set_XXX方法而不是put_XXX方法?这是自动的还是在IDL的某个地方定义的?
答案 0 :(得分:4)
这些是属性访问器方法。当客户端程序在写入时读取属性put_Xxx()时,使用COM服务器的编译器会生成对get_Xxx()的调用。 C#完全不具备的特殊功能是putref_Xxx(),用于明确访问对象而不是值。
Tlbimp.exe执行的正常翻译是一个简单的C#属性。但这并不总是有效,C#对属性的外观要严格得多:
因此Tlbimp.exe被迫处理这些限制,如果COM属性访问器不兼容,那么必须回退到将它们作为普通方法而不是属性公开。使用默认名称,他们将获得get_
和set_
前缀。后者解释了你的问题,他们没有选择put_
因为原因不明确。
值得注意的是,C#版本4放宽了其中的一些限制,最重要的是使Office程序的互操作更容易。温和地说,在早期的C#版本中,这是非常痛苦的。它扩展了属性语法以减轻痛苦,但仅限于COM互操作。非常强烈建议如果您仍然坚持使用旧版本的.NET,现在是考虑更新的好时机。
答案 1 :(得分:3)
属性本身必须有前缀(put_
等),它们有名称,getter方法,setter方法,但没有前缀。从类型库生成的方法表接收前缀以区分getter和setter,从而区分前缀。前缀字符串完全取决于生成名称的人的首选项。
另见:
#pragma
import
个属性 - raw_property_prefixes
默认情况下,低级propget,propput和propputref方法由分别以get_,put_和putref_为前缀命名的成员函数公开。这些前缀与MIDL生成的头文件中使用的名称兼容。