¿Cómo creo un complemento de automatización de Excel en C# que envuelve una función RTD?
-
28-10-2019 - |
Pregunta
Tengo un complemento de automatización basado en RTDServer en funcionamiento:
¿Cómo creo un complemento de automatización de Excel en tiempo real en C# usando RTDServer?.
Crear un envoltorio VBA es trivial:
Function RtdWrapper(start)
RtdWrapper = Excel.Application.WorksheetFunction.RTD("StackOverflow.RtdServer.ProgId", "", start)
End Function
Esto funciona. He intentado crear un envoltorio C# de la siguiente manera:
[ClassInterface(ClassInterfaceType.AutoDual)]
public class RtdWrappers
{
private readonly Microsoft.Office.Interop.Excel.Application _application = new Application();
public object Countdown(object startingCount)
{
var start = Convert.ToInt32(startingCount.ToString());
return _application.WorksheetFunction.RTD("StackOverflow.RtdServer.ProgId", string.Empty, start);
}
[ComRegisterFunctionAttribute]
public static void RegisterFunction(Type t)
{
Microsoft.Win32.Registry.ClassesRoot.CreateSubKey("CLSID\\{" + t.GUID.ToString().ToUpper() + "}\\Programmable");
}
[ComUnregisterFunctionAttribute]
public static void UnregisterFunction(Type t)
{
Microsoft.Win32.Registry.ClassesRoot.DeleteSubKey("CLSID\\{" + t.GUID.ToString().ToUpper() + "}\\Programmable");
}
}
Cuando ingreso "= Countdown (150)" en una celda en Excel, muestra el valor inicial de 150 que es devuelto por ConnectData pero que nunca se actualiza. ¿Hay alguna devolución de llamada que deba registrar? ¿Estoy instanciando el objeto de aplicación correctamente? ¿Qué me estoy perdiendo?
Gracias,
Franco
Solución
De hecho, no está obteniendo el objeto de aplicación correcto. Una solución es implementar el Idtextensibility2 interfaz en su complemento. Esta interfaz tiene un método de OnConnection que Excel llamará al cargar su complemento. En este método, se le pasa el objeto de aplicación que puede mantener en una variable local para su uso posterior.