Получение приложения .net и приложения vb6 для общения друг с другом?

У меня есть пара приложений, которые зависят друг от друга. Одним из них является надежное приложение vb6. Другой — мое долгожданное приложение для системного лотка .net (2.0), использующее скрытую технологию и, вероятно, получившее «Оскар». Приложение vb6 запускает приложение системного трея. И если приложение VB6 закрыто, приложение системного лотка закроется, предполагая, что у него нет другой работы (его работа заключается в сохранении документов в базе данных).

Меня беспокоит только то, что произойдет, если приложение системного лотка выйдет из строя или не сможет выполнять свою работу из-за какой-то фатальной ошибки. Вероятным результатом этого состояния является появление модального диалогового окна с сообщением пользователю: «Немедленно обратитесь в службу поддержки, потому что вы больше не можете сохранять документы».

Я думаю, что наихудший сценарий здесь заключается в том, что всякий раз, когда документ обрабатывается в приложении vb6 (то есть пользователь завершает документ, а его компоненты заархивированы и сохраняются локально), мне просто нужно проверить и посмотреть, не отображается ли системный трей. приложение работает. Я не знаю, это кажется немного громоздким. Есть ли более элегантный подход? Есть ли способ, которым я могу «сигнализировать» моему приложению vb6/заставить мое приложение vb6 прослушивать такой сигнал?


person peacedog    schedule 11.08.2011    source источник
comment
Что скрытого во всем, что делается в .Net? Вам нужна дополнительная (и очень раздутая) среда выполнения, а декомпиляция тривиальна.   -  person Bob77    schedule 12.08.2011
comment
проверь свой сарказмометр   -  person Erix    schedule 12.08.2011
comment
Без сарказма, искреннее любопытство. Мне было интересно, при чем здесь скрытность.   -  person Bob77    schedule 13.08.2011
comment
Он говорил о сверхнадутом сарказме :-))   -  person wqw    schedule 15.08.2011
comment
Скрытный комментарий, как и оскароносный, был нарративным и глупым.   -  person peacedog    schedule 17.08.2011


Ответы (5)


то, что я сделал в прошлом, - это библиотека классов в .NET, представленная как COM-объект (в информации о сборке установите для атрибута ComVisible значение true).

Таким образом, из VB6 вы можете вызывать методы, которые вы экспортировали из библиотеки классов .NET, а в C# вы можете получить весь код, необходимый для обработки ситуации.

Таким образом, я пишу меньше кода на VB6 и больше на C#, где мы можем извлечь выгоду из лучшей обработки исключений (try-catch-finally), фреймворков журналирования, таких как Log4Net и так далее...

это работало очень хорошо для меня до сих пор.

person Davide Piras    schedule 11.08.2011
comment
Вы также можете добавить метод с именем Ping! (просто чтобы сделать все остальные ответы на этот вопрос устаревшими) - person wqw; 15.08.2011

Вы можете использовать WMI, чтобы проверить, работает ли он довольно легко, используя код, похожий на:

dim foundIt
For Each Process in GetObject( "winmgmts://." ).InstancesOf( "win32_process" )
    If UCase( Process.name ) = "MYDOTNET.EXE" Then
        foundIt = true 
    End If
Next
if not foundIt then
    msgbox( "It's not running, so start the process")
end if

Обратите внимание, выше написанное как VBscript, но я бы подумал, что должно работать как код VB6.

person Hans Olsson    schedule 11.08.2011
comment
WMI никогда не следует использовать в приложениях. Это инструмент администратора, который может быть отключен или даже отсутствовать в данной установке Windows. - person Bob77; 12.08.2011
comment
@bob: зависит от приложения и для кого оно предназначено. Я бы не стал использовать WMI для приложения, предназначенного для домашних пользователей, но если это приложение для внутреннего использования в его компании или подобное, как я предполагал, но что может быть не так, тогда он мог бы просто спросить администраторов если WMI доступен, и проблем не будет. - person Hans Olsson; 12.08.2011

У меня нет под рукой подробностей, но в прошлом я использовал обмен сообщениями Windows для отправки WM_NULL. Это равнозначно пинг-сообщению. Таким образом, приложение VB6 отправляет периодический пинг в приложение системного лотка. Если приложение системного лотка не отвечает на пинг своевременно, тогда приложение VB6 знает, что оно зависло или не работает.

person Kevin Gale    schedule 11.08.2011

Мое первое предположение было бы ввести взаимосвязь между ними. Попросите приложение VB6 отправить запрос PING через определенный интервал. Затем, если приложение VB6 не получает ответа или время запроса истекло, сделайте то, что вам нужно.

person Josh    schedule 11.08.2011
comment
Запрос PING к другому приложению на том же компьютере? - person Matt Wilko; 12.08.2011
comment
Почему бы и нет? Я думаю, вы принимаете мой PING как пинг командной оболочки? Я просто говорю о сохранении жизни. Это делается постоянно, особенно между приложениями, которые полагаются друг на друга. Тот факт, что приложения находятся на одном компьютере, не означает, что они не могут взаимодействовать друг с другом. Это ничем не отличается от того, как один отслеживает файл, созданный другим. Я работал в нескольких крупных инженерных фирмах, которые использовали этот метод. Это более эффективно, чем поиск окна или мониторинг процессов для запущенного исполняемого файла. Это также обеспечивает гибкость, если приложения необходимо запускать на отдельных компьютерах. - person Josh; 12.08.2011
comment
Да, PING для большинства людей будет означать команду оболочки PING. Могу ли я предложить вам отредактировать свой ответ, чтобы он был немного яснее, возможно, с некоторым примером кода? - person Matt Wilko; 12.08.2011

Я бы предложил использовать что-то вроде следующей функции на таймере:

'declaration for FindWindow API
Private Declare Function FindWindow _
        Lib "user32" _
        Alias "FindWindowA" _
       (ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long



'Call the following on a timer with the Tray icon form caption
'when it goes False unleash hell
Private Function IsWindowLoaded(ByVal strWindowCaption As String) As Boolean
    Dim lHwnd As Long
    lHwnd = FindWindow(strWindowCaption, vbNullString)
    If lHwnd <> 0 Then
        IsWindowLoaded = True
    Else
        IsWindowLoaded = False
    End If
End Function
person Matt Wilko    schedule 12.08.2011
comment
Вы делаете то же самое, что я предложил ниже, но с гораздо большими накладными расходами. Если вы читаете пост Кевина Гейла выше, он говорит то же самое. Собираетесь ли вы проголосовать за то, что он использовал реальный сценарий? - person Josh; 12.08.2011
comment
@Josh - в ответе Кевина Гейлса говорится о сообщениях Windows - я просто думаю, что вы могли бы отредактировать свой ответ, чтобы было понятнее, что вы имеете в виду. Вероятно, вы все равно могли бы удалить его сейчас, поскольку Кебин Гейл сказал то же самое. - person Matt Wilko; 12.08.2011