Pregunta

¿Cuál sería la mejor manera de exponer cierta funcionalidad en un Dotnet VSTO complemento de Excel en VBA, sin necesidad de que el usuario sea un administrador local (es decir,no hay registro de COM, no HttpListener)?Sería posible utilizar Microsoft Colas de Mensajes de VBA?

¿Fue útil?

Solución

Si me pueden interpretar tu pregunta en términos generales como "¿Cómo puedo exponer la funcionalidad en una .Neto de la asamblea a Excel sin necesidad de registro COM", a continuación, una excelente solución es utilizar Excel XLL de la interfaz.Básicamente uno se despliega un xll calza y un asociado .Net dll.Cuando el xll es cargado refleja el archivo dll y expone las funciones del mismo para Excel.

Una implementación de código abierto se puede encontrar aquí http://exceldna.typepad.com/blog/2006/01/introducing_exc.html

Comerciales, de código cerrado, pero más ricos de la característica de aquí http://www.managedxll.com/

Otros consejos

Usted no puede simplemente crear instancias de las mismas como objetos COM, como VSTO no se ejecuta en el dominio de aplicación predeterminado.

Aquí es cómo yo lo he hecho, que es sin duda un poco complicada.Esto fue con un VSTO libro guardado como un archivo XLA, que en algunos aspectos es más flexible que un puro VSTO complemento.

  • Se necesita generar un tipo de biblioteca utilizando regasm.exe que se hace referencia por el código de VBA.

  • Crear una raíz clase de fábrica en su .NETO modelo de objetos, que es capaz de crear instancias de cualquiera de las clases que desea consumir en VBA (algo así como la "Aplicación" de la clase en los modelos de objetos de Office).

  • Usted necesita encontrar una manera de pasar una referencia a una instancia de esta clase de fábrica de VBA.Una vez VBA tiene una referencia a una instancia de esta clase de fábrica, puede llamar a sus métodos para crear instancias de otros objetos en su .NETO modelo de objetos.

  • Para pasar una instancia de VBA, definir una macro en VBA código como sigue

Ejemplo de código:

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 para el VSTO ThisWorkbook_Open controlador de eventos, que crea su objeto de fábrica y se llama a la macro anterior pasa una referencia al objeto de fábrica.

Ejemplo de código:

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 un par de cuestiones a tener en cuenta para obtener esta trabajando con firmeza - si usted está interesado en el seguimiento de este hágamelo saber y voy a publicar más detalles.

Usted puede estar interesado en Excel4Net (es similar a ExcelDNA y ManagedXll, pero más fácil de usar):

página web:http://www.excel4net.com

blog:http://excel4net.blogspot.com

Apenas para la referencia para los futuros lectores:También puede que quieras echar un vistazo a esta pregunta:

El acceso a una VSTO solicitud de complemento de los tipos de VBA (Excel)

y, en particular, para el blog que se hace referencia no:

VSTO complementos, COMAddIns y RequestComAddInAutomationService

Reemplazando RequestComAddInAutomationService() usted puede exponer cualquier funcionalidad que desee, mediante la definición de una Fachada de la clase que proporciona puntos de entrada para todas esas características, y la exposición de esa clase de VBA.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top