"不可打印的IUnknown *"在互操作类型库

时间:2016-03-04 19:44:59

标签: c# vb.net com idl

我正在定义一系列可COM调用的接口,我可以用它来从VBA访问.NET程序集,这个设置类似于我过去多次做过的。对于这组类,如果托管代码在方法上使用可选的可为空参数,我在接口上定义了一个使用变量的方法。此代码似乎正常运行,因为从VBA调用时,我可以将任一参数作为空值或填充值传递,并且.NET正确接收可选参数,作为null或作为我可以尝试强制转换和使用的对象。奇怪的是,在读取我使用REGASM创建的类型库的IDL时,我看到:

HRESULT SetCommentData(
   [in, optional, defaultvalue(<unprintable IUnknown*>)] VARIANT sequencenumber, 
   [in, optional, defaultvalue("")] BSTR Message);

.NET中的方法定义是:

VB.NET:

'managed definition in class
Public Sub SetCommentData(Optional sequencenumber As Decimal? = Nothing, _
                 Optional message As String = Nothing)


'managed definition in class for COM
Public Sub SetCommentData(Optional sequencenumber As Object = Nothing, _
                     Optional message As String = Nothing) Implements _
                     _RoutingComment.SetCommentData


'managed definition in interface
Sub SetCommentData(Optional sequencenumber As Object = Nothing, _
                     Optional message As String = Nothing)

或者如果你喜欢C#:

//managed definition in class
public void SetCommentData(decimal? sequencenumber = null, string message = null)

//managed definition in class for COM
public void SetCommentData(object sequencenumber = null, string message = null)

//managed definition in interface
void SetCommentData(object sequencenumber = null, string message = null)

我的猜测是COM不知道.NET null对象是什么,这就是为什么它默认为IUnknown。将字符串默认设置为&#34;&#34;有点有趣(特别是因为我说null!),但我想这一定是REGASM中的一个特例。我认为调用者对默认值有什么影响并不重要,因此它更多地作为程序员的Intellisense信息而不是binder /编译器提供。既然它正在工作,也许我不应该担心这个IDL,但我想知道是否有一个COMAttribute或我可以申请澄清默认值为null的东西。 VBA对象查看器似乎没有注意默认值,显示:

Sub SetCommentData([sequencenumber], [Message As String])

简而言之,这是一个可以忽略不计的互操作工件,仅仅是信息性的,或者在某些情况下,这可能对程序产生有意义的影响吗?不知道在这种情况下什么是无法打印的意思,所以任何知道这一点的人都可以对此提出异议。

0 个答案:

没有答案