내 문제는 간단하다, 나는이 부울 인수 밖으로 전달하는 VB6 라이브러리에 선언 된 이벤트 : 내 C# 코드를 위로 구부려 한VB6 이벤트 전달 부울 인수
Public Event WriteComplete(ByVal aCommsOk As Boolean, ByVal aBadPIN As Boolean)
을 이 이벤트에 여러 번이나 기이하게도 테스트 부서와 다른 두 사람이 VB6에서 aBadPIN을 false로 설정하여이 이벤트를 발생 시키지만 C# 이벤트 핸들러는이를 사실로 수신한다는 사실을 알게되었습니다. 일관성이 없기 때문에 '그'문제 중 하나이지만 인터넷에서 도움이되는 내용을 찾지는 못합니다.
부울을 바이트로 변환하고 전송 한 새로운 이벤트를 정의한 다음 C#으로 다시 변환하면 문제가있는 시스템에서 문제가 해결된다는 사실을 발견했습니다. 그러나 필자는 COM과 .NET 라이브러리간에 마샬링되는 모든 단일 부울에 대해이를 수행해야하므로 실제로 그렇게하고 싶지는 않습니다.
EAX 레지스터를 false로 올바르게 표현하려면 EAX 레지스터를 강제해야하는 버그 (적어도 C++에서는)가 있지만 어쨌든 전에는이 문제가 없었던 곳을 솔직하게 읽었습니다. 어쨌든 VB6에서 그 일을 시작하십시오.
모든 아이디어가 우수 할 것입니다.
업데이트 : 로깅은이 문제가 발생하면 이벤트를 발생시키는 호출이 C# 이벤트 처리기가 실행되기 전에 VB6 코드로 제어를 반환한다는 것을 보여줍니다. 그게 뭐야?
업데이트 : 발생 코드가 종료 된 후에도 여전히 이벤트 처리기에서 이벤트를 수신하고 있지만 변경 사항을 마샬링하지 않으려 고 시도했습니다. 시간 제약으로 슬프게도 래퍼를 추가해야합니다.
C# interop 게시는 유용 할 것입니다. – vcsjones
VB 6에서'false'는 0으로 표현되고'true'는 -1로 표현됩니다 (또는 NOT false). 부울 값을 C# 측에서 올바르게 마샬링하지 않거나 잘못된 숫자 리터럴을 검사하는 경우 잘못된 결과를 얻게됩니다. 물론, vcsjones가 말했듯이, 나머지 코드를 제공하지 않으면 디버깅이 불가능합니다. –
VB는 VARIANT_BOOL 유형을 사용하며, 이는 짧음 (16 비트)입니다. 이것을 32 비트로 정렬하면 다른 16 비트가 0이 아닌 경우 False가 True로 표시됩니다. 명시 적 마샬링을하고 계시거나 COM interop에서 모든 것을 처리하고 있습니까? – arx