La DLL C # non può influenzare il valore di un numero passato per riferimento da un’applicazione VB6

Ho un’applicazione legacy VB6 che chiama una DLL VB6 e sto provando a portare la DLL VB6 a C # senza ancora toccare il codice dell’applicazione VB6 principale. La vecchia DLL VB6 aveva un’interfaccia che riceveva un VB6 lungo (numero intero a 32 bit) per riferimento e aggiornava il valore. Nella DLL C # che ho scritto, il valore aggiornato non è mai visto dall’applicazione VB6 principale. Funziona come se ciò che è stato realmente convalidato nella DLL C # fosse un riferimento a una copia dei dati originali, non un riferimento ai dati originali. Posso passare correttamente le matrici per riferimento e aggiornarle, ma i singoli valori non si comportano.

Il codice DLL C # assomiglia a qualcosa del genere:

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

Il codice VB6 chiamante assomiglia a questo:

 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 

Che cosa sto facendo di sbagliato? Cosa dovrei fare per risolverlo? Grazie in anticipo.

     dll.Increment( num ) 

    Poiché si utilizzano le parentesi, il valore viene forzatamente passato per valore, non per riferimento (il compilatore crea una copia temporanea e la passa per riferimento).

    Rimuovi le parentesi:

     dll.Increment num 

    EDIT: una spiegazione più completa di MarkJ .