Come posso creare un componente aggiuntivo di automazione Excel in C# che avvolge una funzione RTD?

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

Domanda

Ho un componente aggiuntivo di automazione basato su RTDServer funzionante:
Come si crea un componente aggiuntivo di automazione Excel in tempo reale in C# usando RTDServer?.

Creare un involucro VBA è banale:

Function RtdWrapper(start)
    RtdWrapper = Excel.Application.WorksheetFunction.RTD("StackOverflow.RtdServer.ProgId", "", start)
End Function

Questo funziona. Ho tentato di creare un wrapper C# come segue:

[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");
    }
}

Quando inserisco "= Countdown (150)" in una cella in Excel, mostra il valore iniziale di 150 che viene restituito da ConnectData ma non si aggiorna mai. C'è qualche callback che dovrei registrarmi? Sto istanzionando correttamente l'oggetto dell'applicazione? Cosa mi manca?

Grazie,

Franco

È stato utile?

Soluzione

In effetti, non stai ottenendo l'oggetto applicazione giusto. Una soluzione è implementare il Idtextensibility2 interfaccia nel tuo componente aggiuntivo. Questa interfaccia ha un metodo di onconnection che Excel chiamerà quando si carica il componente aggiuntivo. In questo metodo viene superato l'oggetto dell'applicazione che è possibile conservare in una variabile locale per un uso successivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top