C # DLL no puede afectar el valor de un número pasado por referencia desde una aplicación VB6

Tengo una aplicación VB6 heredada que llama a una DLL VB6, y estoy tratando de portar la DLL VB6 a C # sin tocar el código principal de la aplicación VB6. La antigua DLL VB6 tenía una interfaz que recibía un VB6 largo (entero de 32 bits) por referencia y actualizaba el valor. En la DLL de C # que he escrito, la aplicación principal VB6 nunca ve el valor actualizado. Actúa como si lo que realmente se organizó para la DLL C # fuera una referencia a una copia de los datos originales, no una referencia a los datos originales. Puedo pasar arreglos con éxito por referencia y actualizarlos, pero los valores individuales no se comportan.

El código DLL de C # se ve así:

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

El código de llamada VB6 se ve más o menos así:

 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 

¿Qué estoy haciendo mal? ¿Qué debería hacer para arreglarlo? Gracias por adelantado.

 dll.Increment( num ) 

Debido a que está utilizando paréntesis, el valor se transmite a la fuerza por valor, no por referencia (el comstackdor crea una copia temporal y la pasa por referencia).

Eliminar los paréntesis:

 dll.Increment num 

EDITAR: Una explicación más completa por MarkJ .