Извините, что проблема не была такой простой, как побитовая логика в мире VB6.
Если проблема сводится к маршалингу, возможно ли, что библиотека взаимодействия, создаваемая .NET, каким-то образом не синхронизированас соответствующей DLL VB6?(Кроме того, вы знакомы с настройками двоичной совместимости в VB6?)
Для хихиканья я сделал следующее - пожалуйста, дайте мне знать, если этот простой набор проектов является типичной моделью для кодирования илисортировочная проблема, которую вы отслеживаете.Если эта проблема имеет маршаллинг, может быть полезно проработать ее в упрощенных версиях проектов c # и vb6, чтобы отследить ее.
С VB6 я создал простую ActiveX DLL (проект с именем LibBoolBuster) скласс с именем BoolBuster:
Public Event WriteComplete(ByVal aCommsOk As Boolean, ByVal aBadPIN As Boolean)
Public Sub DoIt(ByVal Mode As Integer)
RaiseEvent WriteComplete(CBool(Mode And 1), CBool(Mode And 2))
End Sub
В VS2003 (старый .NET, но все равно должен применяться) я создал простое приложение на C # для Windows, имеющее форму с четырьмя кнопками и ссылающееся на приведенную выше библиотеку ActiveX VB6.,Я сделал член в форме, которая обращается к VB6 DLL:
public LibBoolBuster.BoolBuster vb6Obj = new LibBoolBuster.BoolBuster();
DLL через Interop is LibBoolBuster;Класс BoolBuster имеет событие и член DoIt.В инициализации формы подключение события выполняется следующим образом:
vb6Obj.WriteComplete += new LibBoolBuster.__BoolBuster_WriteCompleteEventHandler(vb6Obj_WriteComplete);
Обработчик события WriteComplete является членом формы:
private void vb6Obj_WriteComplete ( System.Boolean aCommsOk , System.Boolean aBadPIN )
{
MessageBox.Show(aCommsOk.ToString() + ", " + aBadPIN.ToString());
}
Каждый обработчик события нажатия кнопки делает простойвызов DoIt:
vb6Obj.DoIt(0);
(и vb6Obj.DoIt (1), vb6Obj.DoIt (2) и т. д.)
Очень простой проект: нажмите кнопку, вызывается DoIt,Событие WriteComplete происходит.Я попробовал, и все заработало, как и ожидалось.
Внимательно посмотрите на сторону VB6.Вы указали, что событие инициировано с помощью:
RaiseEvent WriteComplete(aCommsReceived, Not (aIsAcknowledged))
Убедитесь, что aIsAcknowledged имеет значение либо 0, либо -1;в противном случае вы не получите ожидаемого результата.
VB6 Булевы операторы все побитовые;то есть (не 1) приводит к -2, а не к нулю.
Кроме того, в VB6 любое ненулевое целое число будет отображаться в True при преобразовании из целого в логическое значение - только ноль становится ложным.