Совместное использование надстройки между приложениями Office

Я написал общую надстройку Office на C# и .NET 2.0. Он использует одну и ту же оболочку COM для всех офисных приложений. В настоящее время каждый экземпляр создает собственный экземпляр моего класса — они не знают о том, что надстройка работает в другом приложении.

Можно ли сделать так, чтобы, скажем, надстройка Word при запуске определяла, что надстройка Excel уже запущена? Могут ли они общаться между собой?

Допустим, моя dll называется Addin.dll. Когда, например, открывается Word, он запускает код Addin.dll, реализующий интерфейс IExtensibility, и создает класс, назовем его WordAddin. Когда Excel открывается, он также запускает код в Addin.dll и создает экземпляр ExcelAddin. Теперь предположим, что Word запущен и WordAddin существует. При открытии Excel Addin.dll загружается в другой домен приложения. Он не знает, что WordAddin существует. Я хочу, чтобы ExcelAddin знал, что WordAddin существует, и мог взаимодействовать с ним, возможно, через родительский класс, который создает и то, и другое.

Кто-нибудь знает, как это сделать?


person emrosenf    schedule 11.07.2009    source источник


Ответы (3)


Это можно сделать с помощью очереди сообщений Microsoft (MSMQ): Использование очереди сообщений Microsoft в C# для межпроцессного взаимодействия

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

Приложение C# с одним экземпляром — для .NET 2.0

Не совсем то, о чем вы спрашиваете, но может представлять интерес: Обнаружение запущенного экземпляра программы и передача ему информации

person Mitch Wheat    schedule 11.07.2009
comment
Спасибо! Допустим, моя dll называется Addin.dll. Когда, например, открывается Word, он запускает код Addin.dll, реализующий интерфейс IExtensibility, и создает класс, назовем его WordAddin. Когда Excel открывается, он также запускает код в Addin.dll и создает экземпляр ExcelAddin. Теперь предположим, что Word запущен и WordAddin существует. При открытии Excel Addin.dll загружается в другой домен приложения. Он не знает, что WordAddin существует. Я хочу, чтобы ExcelAddin знал, что WordAddin существует, и мог взаимодействовать с ним, возможно, через родительский класс, который создает и то, и другое. - person emrosenf; 11.07.2009

В итоге я использовал именованные каналы для связи между процессами.

person emrosenf    schedule 13.07.2009

Я действительно сделал именно то, о чем вы спрашиваете. Я пошел на старомодные сообщения Windows. Ничего особенного - так что это просто сработает! :-)

Позвольте вашей надстройке создать «окно» с помощью класса NativeWindow и дать ему предопределенное уникальное имя. Затем найдите другой экземпляр такого окна, используя GetWindow и GetWindowText при запуске вашей надстройки. Общайтесь с помощью SendMessage или PostMessage. Просто так.

person Dan Byström    schedule 11.07.2009