c# DLL不能影响VB6应用程序通过引用传递的数字的值

本文关键字:引用 数字 不能 DLL 影响 VB6 应用程序 | 更新日期: 2023-09-27 18:13:54

我有一个调用VB6 DLL的遗留VB6应用程序,我正在尝试将VB6 DLL移植到c#,而尚未触及主要的VB6应用程序代码。旧的VB6 DLL有一个接口,它通过引用接收VB6 long(32位整数),并更新该值。在我编写的c# DLL中,更新的值永远不会被主VB6应用程序看到。它的作用就好像真正封送到c# DLL的是对原始数据副本的引用,而不是对原始数据的引用。我可以成功地通过引用传递数组,并更新它们,但单个值不起作用。

c# DLL代码看起来像这样:

[ComVisible(true)]
public interface IInteropDLL
{
   void Increment(ref Int32 num);
}
[ComVisible(true)]
public class InteropDLL : IInteropDLL
{
    public void Increment(ref Int32 num) { num++; }
}

调用的VB6代码看起来像这样:

Private dll As IInteropDLL
Private Sub Form_Load()
    Set dll = New InteropDLL
End Sub
Private Sub TestLongReference()
    Dim num As Long
    num = 1
    dll.Increment( num )
    Debug.Print num      ' prints 1, not 2.  Why?
End Sub

我做错了什么?我要怎么做才能修好它?

c# DLL不能影响VB6应用程序通过引用传递的数字的值

dll.Increment( num )

因为你使用了圆括号,值被强制按值传递,而不是按引用传递(编译器创建一个临时副本,并通过引用传递)。

去掉括号:

dll.Increment num

编辑:MarkJ给出了更完整的解释