C # DLL не может влиять на значение числа, переданного по ссылке из приложения VB6 - PullRequest
4 голосов
/ 09 ноября 2011

У меня есть устаревшее приложение VB6, которое вызывает библиотеку VB6 DLL, и я пытаюсь перенести библиотеку VB6 DLL на C #, не затрагивая при этом основной код приложения VB6. Старая библиотека VB6 имела один интерфейс, который получал ссылку VB6 (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

Что я делаю не так? Что я должен сделать, чтобы это исправить? Заранее спасибо.

1 Ответ

9 голосов
/ 09 ноября 2011
dll.Increment( num )

Поскольку вы используете скобки, значение принудительно передается по значению, а не по ссылке (компилятор создает временную копию и передает , что по ссылке).

Снять скобки:

dll.Increment num

РЕДАКТИРОВАТЬ: Более полное объяснение от MarkJ .

...