C # DLL não pode afetar o valor de um número passado por referência de um aplicativo VB6

Eu tenho um aplicativo herdado VB6 que chama uma DLL VB6 e estou tentando portar a DLL VB6 para c # sem tocar o código do aplicativo VB6 principal. A DLL VB6 antiga tinha uma interface que recebia um VB6 longo (inteiro de 32 bits) por referência e atualizava o valor. Na DLL C # eu escrevi, o valor atualizado nunca é visto pelo aplicativo VB6 principal. Ele age como se o que realmente foi empacotado para o C # DLL fosse uma referência a uma cópia dos dados originais, não uma referência aos dados originais. Eu posso passar com êxito as matrizes por referência e atualizá-las, mas valores únicos não estão se comportando.

O código DLL C # é algo como isto:

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

O código de chamada VB6 é algo como isto:

 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 

O que estou fazendo de errado? O que eu teria que fazer para consertar isso? Desde já, obrigado.

 dll.Increment( num ) 

Como você está usando parênteses, o valor é forçado a ser passado por valor, não por referência (o compilador cria uma cópia temporária e a transmite por referência).

Remova os parênteses:

 dll.Increment num 

EDIT: Uma explicação mais completa por MarkJ .