Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Excel调用RTD服务器时出现异常_C#_Visual Studio_Excel_Vsto_Rtd - Fatal编程技术网

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

C# 从Excel调用RTD服务器时出现异常,c#,visual-studio,excel,vsto,rtd,C#,Visual Studio,Excel,Vsto,Rtd,我使用VisualStudio2010编写了一个VSTO Excel加载项,在克服了微软在正直的开发人员道路上设置的大部分障碍后,我终于不得不承认失败 我的项目包含一个带有一些控件的功能区、一个自定义任务窗格(允许用户通过RESTful界面搜索数据库)和一个RTD服务器(允许用户将这些数据放在工作表中)。到目前为止,到目前为止。。。好吧,很痛苦,我想:在与互操作、ComVisibility和AppDomains进行了大量斗争之后(这是一个多么好的想法!),我目前的状态如下 在工作表中,我为RTD

我使用VisualStudio2010编写了一个VSTO Excel加载项,在克服了微软在正直的开发人员道路上设置的大部分障碍后,我终于不得不承认失败

我的项目包含一个带有一些控件的功能区、一个自定义任务窗格(允许用户通过RESTful界面搜索数据库)和一个RTD服务器(允许用户将这些数据放在工作表中)。到目前为止,到目前为止。。。好吧,很痛苦,我想:在与互操作、ComVisibility和AppDomains进行了大量斗争之后(这是一个多么好的想法!),我目前的状态如下

在工作表中,我为RTD调用一个包装函数,如下所示(截取):

这是加载项类的一部分:

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]
   }
}
在调试模式I中:

  • 创建一个空的新工作簿
  • 向单元格中添加“=RTD(…)”公式
  • 向单元格添加包装函数调用“=调用(…)”
  • 保存工作簿
  • 打开工作簿
  • 停止调试并重新启动
  • 打开工作簿
  • 我观察到:

    • 3岁时,一切正常
    • 5岁时,一切正常
    • 在7时,当重新计算单元格时,我得到一个
      无法获取工作表函数类的RTD属性的异常(在3的单元格中)和
      #N/a(在2的单元格中)。但是,我可以看到主题已在RTD服务器中注册,一旦数据可用,异常将被替换为正确的数据。此外,如果我不重新计算单元格,它们将显示保存的值,然后在数据可用时正确更新为检索到的值
    如果在部署模式下,我观察到:

    • 在2点时,我得到了
      #N/A
    • 在3时,我得到一个
      无法获取WorksheetFunction类的RTD属性的异常
    需要帮忙吗(

    编辑:

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

    干杯,
    Che

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

    RTD服务器是否依赖于其他外接程序?2)在部署时失败的事实使RTD服务器看起来需要初始化一些其他位才能正常运行。按照VSTO外接程序的组合方式,RTD服务器和COM外接程序的程序集可能完全单独加载,在有问题的情况下,首先加载RTD实例

    也许您可以使用示例RTD服务器而不是您自己的服务器进行测试,只是为了确认错误在那里,而不是在包装器中或VSTO加载项的其他地方。然后,您可以深入您的RTD服务器,看看哪里出了问题

    -戈弗特


    -免费轻松的.NET for Excel

    Govert,感谢您的输入。很高兴知道异常仅仅意味着存在某种错误-有没有办法获得实际的异常?我能得到的“最深”的异常是
    System.Runtime.ForwardCallToInvokeMember
    ——当然没有参数等。顺便说一句:服务器确实依赖于加载在不同AppDomain中的对象。我需要有一些方法在AppDomain之间进行通信,因为正如您所说,RTD服务器是在DefaultDomain中启动的。我将尝试从服务器中删除所有这些依赖项,然后再试一次……或者将其移到Excel DNA中,然后清除这些黏液;-)(虽然您的自定义任务窗格可能需要一些工作…)是的,我一开始就在考虑Excel DNA,但是,任务一开始似乎很简单。如果我只知道微软想让你做什么来让最简单的事情正常工作。。。无论如何,我在调试日志中发现了另一个异常:在mscorlib.dll
    中发生了“System.Runtime.InteropServices.COMException”类型的第一次异常。这是否意味着我的包装器类
    MyAddin`导致了问题?也许您可以尝试使用完全独立的RTD服务器?这将孤立问题。
    namespace Some 
    {
       [Guid("...")]
       [ComVisibleAttribute(true)]
       [ClassInterface(ClassInterfaceType.AutoDual)]
       [ProgId("MyRTDServer")]
    
       public class Server : Excel.IRtdServer
       {
          [snip]
       }
    }