Вы не можете просто создать их экземпляры как 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());
}
}
Есть еще несколько вопросов, которые необходимо рассмотреть, чтобы это работало надежно - если вы заинтересованы в этом, дайте мне знать, и я опубликую более подробную информацию.