.net - VB6 .Net 互操作。将 .Net Date 属性传递给 VB6 函数 ByRef 未更新

标签 .net vb.net vb6 com-interop vb6-migration

我有一个 .Net 应用程序的混合 VB6(入口点)。

在.Net中,我有一个类,它有一个Date属性(Date1-Date4),并且对VB6代码公开并且COM可见等。

在 VB6 代码中,有一个方法采用 Date ByRef 并对其进行修改。

对于在 VB6 (dt1-dt4) 中声明的日期,这工作正常,我传递 ByRef 的日期变量会更新,但是如果我在我的类上传递 .Net 日期 (Date1-Date4),它不会更新。

解决方法是将 TmpDate 传递给该方法,然后将值分配给 .Net 属性。

但是,我想找到一个合适的解决方案,因为当我替换 VB6 代码时,这很容易被忽略。

VB.Net声明

<ComVisible(True)>
Public Class DotNetDatesClass
    Implements INotifyPropertyChanged, IDotNetDatesClass

     Private _Date1 As DateTime

     <ComVisible(True)> 
      Public Property Date1 As DateTime Implements IDotNetDatesClass.Date1   
            Get
                Return _Date1
            End Get
            Set(value As DateTime)
                _Date1 = value                   
            End Set
        End Property

VB6 示例:

    dotNetDates.Date1 = DEFAULT_DATE
    dotNetDates.Date2 = DEFAULT_DATE
    dotNetDates.Date3 = DEFAULT_DATE
    dotNetDates.Date4 = DEFAULT_DATE

    getDates connectionString, dotNetDates.Date1, dotNetDates.Date2, dotNetDates.Date3, dotNetDates.Date4

解决方法:

    Dim dt1 As Date
    Dim dt2 As Date
    Dim dt3 As Date
    Dim dt4 As Date

    getDates connectionString, dt1, dt2, dt3, dt4

    dotNetDates.Date1 = dt1
    dotNetDates.Date2 = dt2
    dotNetDates.Date3 = dt3
    dotNetDates.Date4 = dt4

最佳答案

在第一个代码示例中,您传递了一个属性 (dotNetDates.Date1)。在第二个代码示例中,您传递了一个变量 (dt1)。

VB6 和 VBA 不支持通过 ByRef 传递属性。 (.NET CLR 也不支持,但有趣的是,VB.NET 支持它,请参阅 The many cases of ByRef。)

重现示例(纯 VBA)

类我的类

Option Explicit

Private myvalue As String

Public Property Get value() As String
    value = myvalue
End Property

Public Property Let value(ByVal vNewValue As String)
    myvalue = vNewValue
End Property

测试代码

Public Sub test_byref()
    Dim x As New myclass

    x.value = "OLD"
    modify x.value
    Debug.Print x.value     ' Prints OLD
End Sub

Private Sub modify(ByRef s As String)
    s = "NEW"
End Sub

关于.net - VB6 .Net 互操作。将 .Net Date 属性传递给 VB6 函数 ByRef 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48642619/

相关文章:

用于解析源代码文件的.Net 库?

c# - 如何始终显示 float 的小数点?

c# - 容错 XML 阅读器

.net - 使用表格副本

json - VBA从集合中获取值?

excel - VB6通过excel打印并选择两台打印机之一

mysql - 如何检查服务器是否打开并显示消息框

c# - 在读取和写入 MongoDB(C# 驱动程序)时,如何决定哪些异常值得重试?

django - 使用 VB.net/Django/PostgreSQL 将条目插入表时出现问题

vb.net - 双击列表框中的项目时如何运行子程序