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

StackOverflow https://stackoverflow.com/questions/120579

  •  02-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

  • Создайте в своей объектной модели .NET корневой фабричный класс, способный создавать экземпляры любых классов, которые вы хотите использовать в VBA (что-то вроде класса «Приложение» в объектных моделях 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());
     }
}

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top