Как вызвать метод VSTO AddIn из отдельного проекта C #? - PullRequest
6 голосов
/ 13 февраля 2009

У меня есть проект надстройки C # Excel «MyExcelAddIn», в котором есть открытый метод Foo () для выполнения чего-то сложного. В целях тестирования надстройка также определяет кнопку на панели инструментов, которая связана с Foo (), поэтому я могу проверить это и убедиться, что нажатие кнопки вызывает Foo () и делает то, что я хочу. Это хорошо.

Теперь я хочу вызвать этот метод из проекта C # Windows Forms. В проекте Windows Forms я могу создать экземпляр Excel, сделать его видимым и убедиться, что моя надстройка VSTO работает так, как я вижу кнопку, и она работает. Но я не могу понять, как программно вызывать Foo () из проекта Windows Forms. Я немного погуглил и дошел до получения COMAddIn объекта MyExcelAddIn, но не могу понять, как вызвать Foo ().

Это выглядит примерно так:

// Create Excel and make it visible
Application excelApp = new Application();
excelApp.Visible = true;

// I know my VSTO add-in is running because I can see my test button
// Now get a reference to my VSTO add-in
Microsoft.Office.Core.COMAddIns comAddIns = _excelApp.COMAddIns;
object addinName = "MyExcelAddIn";
Microsoft.Office.Core.COMAddIn myAddin = comAddIns.Item(ref addinName);
// This works, but now what? How do I make a call on myAddin?
// Note that myAddin.Object is null...

Итак, я хочу знать, что я могу сделать, чтобы вызвать Foo () из моего приложения Windows Forms. Обратите внимание, что у меня есть полный контроль над приложением Windows Forms и надстройкой, и я подозреваю, что должен внести изменения в них обоих (в частности, надстройку), но я не знаю, как это сделать.

Обратите внимание, что это приложение VS2008 C #, и я использую Excel 2003.

Ответы [ 4 ]

5 голосов
/ 14 мая 2009

Если вы создаете надстройку уровня приложения, я думаю, что это может быть вашим ответом: MSDN VSTO Article

Включает два этапа: (из статьи)

  1. В вашей надстройке предоставьте объект другим решениям.
  2. В другом решении получите доступ к объекту, открытому вашей надстройкой, и вызовите членов объекта.

Другое решение может быть: (опять же из статьи)

  • Любое решение, которое выполняется в процессе, отличном от вашей надстройки (эти типы решений также называются клиентами вне процесса). К ним относятся приложения, которые автоматизируют приложение Office, например приложение Windows Forms или консоль, и надстройки, загружаемые в другом процессе.
1 голос
/ 14 марта 2009

Для этого я использую Win32 API SendMessage. Моя надстройка C # создает «NativeWindow» с уникальным заголовком окна, который может найти приложение WinForm.

0 голосов
/ 01 июля 2015

Для тех, кто находит это, вот что я сделал:

        object addInName = "AddinName";
        var excelApplication = (Microsoft.Office.Interop.Excel.Application)Marshal.GetActiveObject("Excel.Application");
        COMAddIn addIn = excelApplication.COMAddIns.Item(ref addInName);

        addIn.Object.AddinMethodName(params);

Также пришлось добавить ссылку на Microsoft.Office.Core в COM и Excel.Interop в разделе «Сборки».

0 голосов
/ 13 февраля 2009

Я предполагаю, что ваш метод Foo как-то взаимодействует с Excel. В противном случае вы можете просто добавить ссылку на сборку, содержащую класс, с методом Foo и вызывать ее оттуда без создания экземпляра Excel.

Единственный способ, которым я могу думать, - это получить ссылку на ваш CommandBarButton через объект excelApp. CommandBarButton имеет метод Execute, который похож на нажатие кнопки. Примерно так:

        Excel.Application excelApp = new Excel.Application(); 
        CommandBarButton btn = excelApp.CommandBars.FindControl(...) as CommandBarButton;
        btn.Execute();
...