Предоставить VSTO функциональность VBA без локального администратора - PullRequest
2 голосов
/ 23 сентября 2008

Каков наилучший способ предоставления определенных функций в надстройке Dotnet VSTO Excel для VBA без необходимости того, чтобы пользователь был локальным администратором (т. Е. Без регистрации COM, без HttpListener )? Можно ли использовать очереди сообщений Microsoft из VBA?

Ответы [ 4 ]

3 голосов
/ 23 сентября 2008

Если я могу интерпретировать ваш вопрос так же широко, как «Как представить функциональность в сборке .Net в Excel без регистрации COM», то отличным решением будет использование интерфейса XLL в Excel. В основном, один развертывает xll shim и связанный .Net dll. Когда xll загружен, он отражается над dll и предоставляет доступ к функциям в Excel.

Реализацию с открытым исходным кодом можно найти здесь http://exceldna.typepad.com/blog/2006/01/introducing_exc.html

Коммерческий закрытый источник, но с большим количеством функций здесь http://www.managedxll.com/

1 голос
/ 04 января 2009

Вас может заинтересовать Excel4Net (он похож на ExcelDNA и ManagedXll, но проще в использовании):

Веб-сайт: http://www.excel4net.com

блог: http://excel4net.blogspot.com

1 голос
/ 23 сентября 2008

Вы не можете просто создать их экземпляры как COM-объекты, так как VSTO не будет работать в домене приложения по умолчанию.

Вот как я это сделал, что, правда, немного запутанно. Это было с книгой VSTO, сохраненной в виде файла XLA, который в некоторых отношениях является более гибким, чем просто надстройка VSTO.

  • Вам необходимо создать библиотеку типов, используя regasm.exe, на который будет ссылаться ваш код VBA.

  • Создайте корневой класс фабрики в вашей объектной модели .NET, который способен создавать экземпляры любых классов, которые вы хотите использовать в VBA (что-то вроде класса «Application» в объектных моделях Office).

  • Затем вам нужно найти способ передать ссылку на экземпляр этого класса фабрики в VBA. Когда VBA имеет ссылку на экземпляр этого фабричного класса, он может вызывать свои методы для создания экземпляров любых других объектов в вашей объектной модели .NET.

  • Чтобы передать экземпляр в VBA, определите макрос в своем коде VBA следующим образом

Пример кода:

Private m_objMyFactory As Object

Public Sub RegisterFactory(MyFactory As Object)

    On Error GoTo ErrHandler
    Set m_objMyFactory = MyFactory
    Exit Sub
ErrHandler:
    MsgBox "An unexpected error occurred when registering the Factory component: " & Err.Description
    Exit Sub
End Sub
  • Теперь добавьте код в обработчик событий VSTO ThisWorkbook_Open, который создает экземпляр вашего фабричного объекта и вызывает указанный выше макрос, передавая ссылку на фабричный объект.

Пример кода:

void ThisWorkbook_Open()
{
     try
     {
         ThisApplication.Run("RegisterFactory",
             new MyNamespace.MyFactory(),
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing);
     }
     catch (Exception ex)
     {
         MessageBox.Show("Load error: " + ex.ToString());
     }
}

Есть еще несколько вопросов, которые необходимо рассмотреть, чтобы это работало надежно - если вы заинтересованы в этом, дайте мне знать, и я опубликую более подробную информацию.

0 голосов
/ 16 августа 2010

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

Доступ к типам приложений VSTO из VBA (Excel)

и, в частности, к блогу, на который есть ссылка:

Надстройки VSTO, COMAddIns и RequestComAddInAutomationService

Переопределив RequestComAddInAutomationService () , вы можете предоставить любую функциональность, какую захотите, определив класс Facade, который предоставляет точки входа для всех этих функций, и выставив этот класс VBA.

...