如何在包含RTD功能的C#中创建Excel自动化加载项?

时间:2011-03-22 21:38:27

标签: c# vsto excel-addins rtd excel-udf

我有一个基于RtdServer的自动化加载项:
How do I create a real-time Excel automation add-in in C# using RtdServer?

创建VBA包装器很简单:

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

这很有效。我试图按如下方式创建一个C#包装器:

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

当我在Excel中的单元格中输入“= Countdown(150)”时,它显示的初始值为150,由ConnectData返回但从不更新。我应该注册一些回调吗?我是否正确实例化了Application对象?我错过了什么?

谢谢,

1 个答案:

答案 0 :(得分:2)

实际上,您没有掌握正确的Application对象。一种解决方案是在加载项中实现IDTExtensibility2接口。此接口具有一个OnConnection方法,Excel将在加载加载项时调用该方法。在此方法中,您将传递Application对象,您可以将其保存在本地变量中以供以后使用。