1

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

我的项目包含一个带有一些控件的功能区、一个允许用户通过 RESTful 界面搜索数据库的自定义任务窗格和一个允许他们将这些数据放入工作表中的 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]
   }
}

在调试模式下我:

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

我观察到:

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

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

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

请问有什么帮助吗?:(

编辑:

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

干杯,车

4

1 回答 1

2

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

您的 RTD 服务器是否对插件的其余部分有任何依赖关系?2) 在部署时失败的事实使得 RTD 服务器看起来需要初始化一些其他位才能正常运行。将 VSTO 加载项放在一起的方式,您的程序集可能会为 RTD 服务器和 COM 加载项完全分开加载,并且在您有问题的情况下,首先加载 RTD 实例。

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

-政府

Excel-DNA - 用于 Excel 的免费且简单的 .NET

于 2011-02-23T06:33:06.167 回答