Использование событий, объявленных в Visual Basic 6.0 в приложении dotnet - PullRequest
3 голосов
/ 12 ноября 2008

мы пишем тесты для библиотеки COM, написанной на VB 6.0. Проблема, с которой мы сталкиваемся, заключается в том, что мы не можем получить доступ к событиям, объявленным в VB (без событий). Мы получаем исключение: «объект не поддерживает множество событий». Как мы можем преодолеть эту проблему?

Ответы [ 2 ]

3 голосов
/ 18 ноября 2008

Ваша насмешливая структура - проблема здесь. Макет объекта, возвращаемого этим вызовом:

repository.DynamicMock<PersonLib.DatabaseCommand>();

реализует интерфейс класса DatabaseCommand, но не высмеивает его события. Следовательно, когда вы передаете экземпляр этого фиктивного объекта в код VB6, который ожидает получить объект DatabaseCommand, который может вызывать события, он не будет работать.

Когда вы передаете фиктивный объект методу PersonClass.Init, вот упрощенная версия происходящего:

  1. Код попадает в эту строку в PersonClass.Init:

    Set dbCommand = vDBCommand

  2. VB6 запрашивает объект справа от оператора Set, если он поддерживает те же события, что и класс DatabaseCommand (VB6 делает это, потому что вы объявили dbCommand с WithEvents ключевое слово, поэтому он попытается настроить приемник событий для получения событий от объекта dbCommand.

  3. Объект, который вы передали, однако, являющийся фиктивным объектом, а не реальным DatabaseCommand объектом, фактически не реализует события, которые реализует реальный класс DatabaseCommand. Когда VB6 сталкивается с этим, он вызывает ошибку, которую вы видите.

Я не могу придумать, как заставить фиктивный объект поддерживать те же события, что и класс DatabaseCommand, чтобы заставить ваш тестовый код работать (ну, я могу придумать один способ, но это потребует перестройки вашего классы), но я могу опубликовать более позже, если я найду более разумное решение.

1 голос
/ 17 ноября 2008

Например, у нас в VB 6.0 есть класс DatabaseCommand.

Option Explicit

Public Event SavedSuccessfully()

Public Sub Execute(ByVal vAge As Integer, ByVal vName As String, ByVal vAddress As String)

    RaiseEvent SavedSuccessfully

End Sub

Теперь, личный класс

Private WithEvents dbCommand As DatabaseCommand

Public Sub Init(ByVal vDBCommand As DatabaseCommand)

    Set dbCommand = vDBCommand

End Sub

Private Sub dbCommand_SavedSuccessfully()
    'not implemented
End Sub

Теперь, когда попробуем проверить это (после компиляции проекта vb)

MockRepository repository = new MockRepository();

PersonLib.DatabaseCommand db = repository.DynamicMock<PersonLib.DatabaseCommand>();

PersonLib.PersonClass person = new PersonLib.PersonClass();

person.Init(db);  --- this line throws error - Object or class does not support the set of events
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...