2009-07-11 3 views
1

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

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

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

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

ответ

1

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

1

Вы можете сделать это с помощью очереди сообщений Microsoft (MSMQ): Use Microsoft Message Queuing in C# for inter-process communication

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

Single-Instance C# Application - for .NET 2.0

Не совсем то, что вы просите, но может представлять интерес: Detecting a running instance of a program and passing it information

+0

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

+0

Предлагаю вам добавить дополнительную информацию. к вашему оригинальному вопросу .... –

0

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

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

Смежные вопросы