从Excel调用RTD服务器时出现异常

时间:2011-02-22 11:06:23

标签: c# visual-studio excel vsto rtd

我使用Visual Studio 2010编写了一个VSTO Excel插件,在设法解决了微软投入正义开发者之路的大部分障碍后,我终于不得不承认失败。

我的项目包含一个带有一些控件的功能区,一个自定义任务窗格,允许用户通过RESTful接口和RTD服务器搜索数据库,RTD服务器允许他们将这些数据放入他们的工作表中。到目前为止,所以...好吧,痛苦,我想:经过与Interop,ComVisibility和AppDomains的斗争(这是一个好主意!),我现在的状态如下。

在工作表中,我像这样调用RTD的包装函数(剪切):

Public Function call(value as String)
    Dim addin as Office.ComAddIn
    Set addin = Application.ComAddIns("MyAddin")
    addin.Object.RTD(value)
End Function

这是插件类的一部分:

namespace Some
{
   [Guid("...")]
   [ComVisibleAttribute(true)]
   [ClassInterface(ClassInterfaceType.AutoDual)]
   public class MyAddin {
      [snip]

      public String RTD(String value)
      {
         String returner = null;
         try
         {
            returner = Globals.ThisAddin.Application.WorksheetFunction.RTD(SERVERID, "", value);
         }
         catch(COMException ce) 
         {
            returner = ce.StackTrace;
         }
         return returner;
      }
   }
}

RTD Server类的相关部分:

namespace Some 
{
   [Guid("...")]
   [ComVisibleAttribute(true)]
   [ClassInterface(ClassInterfaceType.AutoDual)]
   [ProgId("MyRTDServer")]

   public class Server : Excel.IRtdServer
   {
      [snip]
   }
}

在调试模式下I:

  1. 创建一个空的新工作簿
  2. 向单元格添加“= RTD(...)”公式
  3. 向单元格添加包装函数调用“= call(...)”
  4. 保存工作簿
  5. 打开工作簿
  6. 停止调试并重新启动
  7. 打开工作簿
  8. 我观察:

    • 3岁时,一切正常
    • 5岁时,一切正常
    • 在7时,重新计算我的单元格时,我在3)的单元格中得到Unable to get the RTD property of the WorksheetFunction class例外,在2)的单元格中得到#N/A。但是,我可以看到主题已在RTD服务器中注册,一旦数据可用,异常将替换为正确的数据。此外,如果我 NOT 重新计算单元格,它们会显示保存的值,然后在数据可用后正确更新为检索到的值。

    如果处于已部署模式,我会观察:

    • 2,我得到#N/A
    • 3点,我收到Unable to get the RTD property of the WorksheetFunction class例外

    请帮忙吗? :(

    修改

    在空白的Addin项目中使用非常基本的RTD服务器测试相同的过程会显示完全相同的结果:如果在服务器有可用数据之前重新计算RTD公式,则加载的Excel文件会显示#N/A。 我想问一下:WTF?

    干杯, 澈

1 个答案:

答案 0 :(得分:1)

“无法获取RTD属性....”错误只是Excel对象模型的说法,即函数调用中存在错误。

您的RTD服务器是否与其他加载项有任何依赖关系? 2)部署失败的事实使得它看起来像RTD服务器需要在其运行愉快之前初始化其他一些位。将VSTO加载项放在一起的方式,您的程序集可能完全单独加载到RTD服务器和COM加载项,在有问题的情况下,首先加载RTD实例。

也许您可以使用示例RTD服务器而不是您自己的RTD服务器进行测试,只是为了确认错误存在,而不是在包装器或VSTO加载项的其他位置。然后你可以深入了解你的RTD服务器,看看出了什么问题。

-Govert

Excel-DNA - 免费且简单的.NET for Excel