VB6 .Net Interop.将.Net Date属性传递给VB6函数ByRef未更新

apc*_*apc 2 .net vb.net vb6 com-interop vb6-migration

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

在.Net中,我有一个类,它具有Date属性(Date1-Date4),并且公开了,并且COM Visible等等于VB6代码.

在VB6代码中有一个方法,它采用Date ByRef并修改它.

使用在VB6(dt1-dt4)中声明的日期,这可以正常工作,我传递ByRef的日期变量得到更新,但是如果我在我的类(Date1-Date4)上传递.Net日期,它会更新.

work arround是将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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

解决方法:

    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
Run Code Online (Sandbox Code Playgroud)

Hei*_*nzi 5

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

VB6和VBA不支持传递属性ByRef.(.NET CLR也不是,但有趣的是,VB.NET 确实支持它,请参阅ByRef的许多案例.)

Repro示例(纯VBA)

类myclass

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
Run Code Online (Sandbox Code Playgroud)

测试代码

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
Run Code Online (Sandbox Code Playgroud)