.net - resueltos - Exponer la funcionalidad VSTO a VBA sin administrador local
estadistica elemental solucionario (4)
No puede simplemente crear una instancia de ellos como objetos COM, ya que VSTO no se ejecutará en el dominio de aplicación predeterminado.
Así es como lo hice, lo cual es cierto que es un poco intrincado. Esto fue con un libro de trabajo VSTO guardado como un archivo XLA, que de alguna manera es más flexible que un complemento VSTO puro.
Debe generar una biblioteca de tipos utilizando regasm.exe a la que hará referencia su código VBA.
Cree una clase raíz de fábrica en su modelo de objetos .NET, que sea capaz de crear instancias de cualquiera de las clases que desee consumir en VBA (algo así como la clase "Aplicación" en los modelos de objetos de Office).
Luego necesita encontrar una forma de pasar una referencia a una instancia de esta clase de fábrica a VBA. Una vez que VBA tiene una referencia a una instancia de esta clase de fábrica, puede invocar sus métodos para instanciar cualquier otro objeto en su modelo de objetos .NET.
Para pasar una instancia a VBA, defina una macro en su código VBA de la siguiente manera
Código de ejemplo:
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
- Ahora agregue código al controlador de eventos VSTO ThisWorkbook_Open, que crea una instancia de su objeto de fábrica y llama a la macro de arriba pasando una referencia al objeto de fábrica.
Código de ejemplo:
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());
}
}
Hay algunos problemas más a tener en cuenta para que esto funcione de forma robusta. Si está interesado en seguir esto, hágamelo saber y publicaré más detalles.
¿Cuál sería la mejor manera de exponer ciertas funcionalidades en un complemento Dotnet VSTO Excel a VBA, sin requerir que el usuario sea un administrador local (es decir, sin registro COM, sin HttpListener )? ¿Sería posible usar Microsoft Message Queues desde VBA?
Si puedo interpretar su pregunta de forma tan amplia como "¿Cómo expongo la funcionalidad en un ensamblado .Net a Excel sin registro COM?", Entonces una excelente solución es usar la interfaz XLL de Excel. Básicamente uno despliega un shill xll y un dll .Net asociado. Cuando el xll está cargado, se refleja sobre el archivo dll y expone las funciones que contiene a Excel.
Puede encontrar una implementación de código abierto aquí http://exceldna.typepad.com/blog/2006/01/introducing_exc.html
Un comercial, de código cerrado, pero más rico en características aquí http://www.managedxll.com/
Puede estar interesado en Excel4Net (es similar a ExcelDNA y ManagedXll, pero más fácil de usar):
sitio web: http://www.excel4net.com
Solo como referencia para futuros lectores: es posible que también desee echarle un vistazo a esta pregunta:
Acceder a una aplicación VSTO-addin types from VBA (Excel)
y, en particular, al blog al que se hace referencia allí:
Complementos VSTO, COMAddIns y RequestComAddInAutomationService
Al anular RequestComAddInAutomationService () , puede exponer cualquier funcionalidad que desee, definiendo una clase de Fachada que proporcione puntos de entrada para todas esas características y exponga esa clase a VBA.