从Excel中调用RTD服务器时出现exception

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

我的项目包含一个带有一些控件的function区,一个自定义的任务窗格,允许用户通过一个REST风格的界面和一个RTD服务器来search数据库,这个服务器可以让他们把这些数据放在工作表中。 到目前为止,好吧,痛苦的,我猜:经过与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服务器类的相关部分:

 namespace Some { [Guid("...")] [ComVisibleAttribute(true)] [ClassInterface(ClassInterfaceType.AutoDual)] [ProgId("MyRTDServer")] public class Server : Excel.IRtdServer { [snip] } } 

在debugging模式I中:

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

我观察到:

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

如果在部署模式下,我观察到:

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

请帮忙吗? 🙁

编辑:

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

干杯,车

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

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

也许你可以使用示例RTD服务器而不是自己的testing,只是为了确认错误是在那里,而不是在包装器或VSTO加载项中的其他地方。 然后你可以挖掘你的RTD服务器,看看出了什么问题。

-Govert

Excel-DNA – 免费,简单的.NET for Excel