.net удалить Раскрыть функциональность VSTO для VBA без локального администратора




редактирование надстроек excel (4)

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



Вы не можете просто создавать их как объекты 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());
     }
}

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


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

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

Коммерческий, закрытый источник, но более богатый особенностью здесь http://www.managedxll.com/


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

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

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

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

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





officedev