【问题标题】:Implementing property must have matching 'ReadOnly' or 'WriteOnly' specifiers实现属性必须具有匹配的“ReadOnly”或“WriteOnly”说明符
【发布时间】:2012-11-08 04:51:25
【问题描述】:

我在 idl 文件中定义了一个接口,并尝试将 vb6 项目转换为 vb.net。

转换从这个 idl 的 tlb 创建了互操作,在 vs2010 中它抱怨该属性没有被实现(如下所示)。有谁知道为什么?我什至删除了实现并让 vs2010 重新生成存根,但仍然出错。

idl中的示例接口..

[   uuid(...),
    version(2.0),
    dual,
    nonextensible,
    oleautomation
]
interface IExampleInterface : IDispatch
{
 ...
    [id(3), propget]
    HRESULT CloseDate ([out, retval] DATE* RetVal);
    [id(3), propput]
    HRESULT CloseDate ([in] DATE* InVal);
}

VB.Net 类...

<System.Runtime.InteropServices.ProgId("Project1_NET.ClassExample")>
Public Class ClassExample
    Implements LibName.IExampleInterface

    Public Property CloseDate As Date Implements LibName.IExampleInterface.CloseDate
        Get
            Return mDate
        End Get
        Set(value As Date)
            mDate = value
        End Set
    End Property

【问题讨论】:

  • 发布代码时,请将其突出显示并点击{}代码按钮。这让我们将其视为代码并打开语法高亮。
  • 你解决了这个问题了吗?如果你这样做了,请与 as 分享并接受你的回答。

标签: vb.net com vb6 vb6-migration idl


【解决方案1】:

DATE 参数类型是问题所在。它不是 DateTime 或 Date,它是 Double。声明在 WTypes.h SDK 头文件中给出,第 1025 行(对于 v7.1):

 typedef double DATE;

因此,通过将属性声明为 Double 并根据需要来回转换来修复您的属性:

Public Property CloseDate As Double Implements LibName.IExampleInterface.CloseDate
    Get
        Return mDate.ToOADate
    End Get
    Set(value As Date)
        mDate = DateTime.FromOADate(value)
    End Set
End Property

【讨论】:

  • 首先感谢您的回复。但是,将其更改为 Double 也无济于事。
  • 嗯,这是一个非常可靠的解释。如果您需要更多帮助,请将 .tlb 文件复制到文件共享服务。
  • 也许需要&lt;MarshalAs&gt;
猜你喜欢
  • 2011-07-12
  • 2011-10-09
  • 2013-03-04
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多