C# 从Excel调用RTD服务器时出现异常
我使用VisualStudio2010编写了一个VSTO Excel加载项,在克服了微软在正直的开发人员道路上设置的大部分障碍后,我终于不得不承认失败 我的项目包含一个带有一些控件的功能区、一个自定义任务窗格(允许用户通过RESTful界面搜索数据库)和一个RTD服务器(允许用户将这些数据放在工作表中)。到目前为止,到目前为止。。。好吧,很痛苦,我想:在与互操作、ComVisibility和AppDomains进行了大量斗争之后(这是一个多么好的想法!),我目前的状态如下 在工作表中,我为RTD调用一个包装函数,如下所示(截取): 这是加载项类的一部分:C# 从Excel调用RTD服务器时出现异常,c#,visual-studio,excel,vsto,rtd,C#,Visual Studio,Excel,Vsto,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中:
- 3岁时,一切正常
- 5岁时,一切正常
- 在7时,当重新计算单元格时,我得到一个
无法获取工作表函数类的RTD属性的异常(在3的单元格中)和
#N/a(在2的单元格中)。但是,我可以看到主题已在RTD服务器中注册,一旦数据可用,异常将被替换为正确的数据。此外,如果我不重新计算单元格,它们将显示保存的值,然后在数据可用时正确更新为检索到的值
- 在2点时,我得到了
#N/A
- 在3时,我得到一个
无法获取WorksheetFunction类的RTD属性的异常
#N/a
。
我想问一问:WTF
干杯,
Che错误“无法获取RTD属性…”只是Excel对象模型表示函数调用中存在错误的方式 RTD服务器是否依赖于其他外接程序?2)在部署时失败的事实使RTD服务器看起来需要初始化一些其他位才能正常运行。按照VSTO外接程序的组合方式,RTD服务器和COM外接程序的程序集可能完全单独加载,在有问题的情况下,首先加载RTD实例 也许您可以使用示例RTD服务器而不是您自己的服务器进行测试,只是为了确认错误在那里,而不是在包装器中或VSTO加载项的其他地方。然后,您可以深入您的RTD服务器,看看哪里出了问题 -戈弗特
-免费轻松的.NET for ExcelGovert,感谢您的输入。很高兴知道异常仅仅意味着存在某种错误-有没有办法获得实际的异常?我能得到的“最深”的异常是
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]
}
}