我使用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:
我观察:
Unable to get the RTD property of the WorksheetFunction class
例外,在2)的单元格中得到#N/A
。但是,我可以看到主题已在RTD服务器中注册,一旦数据可用,异常将替换为正确的数据。此外,如果我 NOT 重新计算单元格,它们会显示保存的值,然后在数据可用后正确更新为检索到的值。如果处于已部署模式,我会观察:
#N/A
Unable to get the RTD property of the WorksheetFunction class
例外请帮忙吗? :(
修改
在空白的Addin项目中使用非常基本的RTD服务器测试相同的过程会显示完全相同的结果:如果在服务器有可用数据之前重新计算RTD公式,则加载的Excel文件会显示#N/A
。
我想问一下:WTF?
干杯, 澈
答案 0 :(得分:1)
“无法获取RTD属性....”错误只是Excel对象模型的说法,即函数调用中存在错误。
您的RTD服务器是否与其他加载项有任何依赖关系? 2)部署失败的事实使得它看起来像RTD服务器需要在其运行愉快之前初始化其他一些位。将VSTO加载项放在一起的方式,您的程序集可能完全单独加载到RTD服务器和COM加载项,在有问题的情况下,首先加载RTD实例。
也许您可以使用示例RTD服务器而不是您自己的RTD服务器进行测试,只是为了确认错误存在,而不是在包装器或VSTO加载项的其他位置。然后你可以深入了解你的RTD服务器,看看出了什么问题。
-Govert
Excel-DNA - 免费且简单的.NET for Excel