问题描述
我写了使用Visual Studio 2010的Excel VSTO插件和已经设法解决大多数的微软障碍扔进义开发商的路径后,我终于不得不承认失败。
I wrote a VSTO Excel addin using Visual Studio 2010 and after having managed to work around most of the obstacles Microsoft throws into the path of the righteous developer, I finally have to admit defeat.
我的项目包含一些控件的功能区,自定义任务窗格,可让用户通过一个RESTful接口和RTD服务器,让他们把这个数据在搜索数据库他们的工作表。到目前为止,一切都...好,痛苦,我想:很多与互操作,ComVisibility和应用程序域(!有什么了不起的想法),我现在的状态如下:
My project contains a Ribbon with some controls, a custom task pane that allows users to search a database via a RESTful interface and a RTD server that lets them put this data in their worksheets. So far, so ... well, painful, I guess: After a lot of struggle with Interop, ComVisibility and AppDomains (what a great idea!), my current status is as follows.
在工作表,我称之为包装功能RTD像这样(剪断):
In the worksheets, I call a wrapper function for RTD like this (snipped):
Public Function call(value as String)
Dim addin as Office.ComAddIn
Set addin = Application.ComAddIns("MyAddin")
addin.Object.RTD(value)
End Function
这是(部分)的插件类:
This is (part of) the addin class:
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服务器类:
And the relevant part of the RTD Server class:
namespace Some
{
[Guid("...")]
[ComVisibleAttribute(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ProgId("MyRTDServer")]
public class Server : Excel.IRtdServer
{
[snip]
}
}
在调试模式我:
- 创建一个空的新的工作簿
- 添加一个= RTD(。 ..)公式的单元格
- 的包装函数调用添加=调用(...)到细胞
- 保存工作簿
- 打开工作簿
- 停止调试,并开始再次
- 打开工作簿
- Create a, empty new workbook
- Add an "=RTD(...)" formula to a cell
- Add a wrapper function call "=call(...)" to a cell
- Save the workbook
- Open the workbook
- Stop Debugging and start it again
- Open the workbook
我注意到:
- 在3,一切工作正常
- 在5,一切工作正常
- 在7,重新计算我的单元格时,我收到了
无法获取RTD财产在3单元的WorksheetFunction类
除外)和#N / A
在2单元)。不过,我可以看到主题的RTD服务器中注册,一旦数据可用,异常被替换为正确的数据。另外,如果我做的不可以重新计算细胞,它们显示保存的值,而一旦数据可用,那么正确更新检索到的值。
- At 3, everything works fine
- At 5, everything works fine
- At 7, when recalculating my cells, I get a
Unable to get the RTD property of the WorksheetFunction class
exception in the cell of 3) and#N/A
in the cell of 2). However, I can see that the topics are registered in the RTD server and as soon as the data is available, the exception is replaced with the correct data. Also, if I do NOT recalculate the cells, they display the saved value and then correctly update to the retrieved value once the data is available.
如果在部署模式中,我观察到:
If in deployed mode, I observe:
- 在2,我获得
#N / A
- 在3,我收到了
无法获取WorksheetFunction的RTD财产类
例外
- At 2, I get
#N/A
- At 3, I get a
Unable to get the RTD property of the WorksheetFunction class
exception
任何帮助,好吗? (
编辑:
测试相同的步骤一个非常基本的RTD在一个空白的加载项项目的服务器精确地显示出相同的结果:加载的excel文件显示#N / A
如果服务器可用的数据之前RTD-公式重新计算$。 b $ b口想询问:WTF
Testing the same procedure with a very basic RTD server in a blank Addin project shows exactly the same results: a loaded excel file displays #N/A
if an RTD-formula is recalculated before the server has the data available.I would like to inquire: WTF?
干杯,
车
推荐答案
在'无法获取RTD财产......的错误仅仅是Excel对象模型的说法有一个在函数调用错误的方法。
The 'Unable to get the RTD property....' error is just the Excel object model's way of saying there was an error in the function call.
请问您RTD服务器对您的外接其余任何依赖关系?事实上,2)部署失败的时候,使它看起来像RTD服务器需要运行之前愉快一些其他位被初始化。在VSTO外接的方式放在一起,你的装配很可能是为RTD服务器,并为COM加载项,并在有问题的情况下,RTD实例首次加载完全分开装。
Does your RTD server have any dependencies on the rest of your add-in? The fact that 2) fails when deployed, makes it look like the RTD server needs some other bits to be initialized before it runs happily. The way the VSTO add-in is put together, your assembly is likely to be loaded totally separately for the RTD server and for the COM add-in, and in your problematic cases the RTD instance is loaded first.
也许你可以用一个样品RTD服务器,而不是你自己的测试,只是为了确认该错误是存在的,而不是在包装或VSTO外接其他地方。然后你就可以挖掘到您的RTD服务器,看看有什么不顺心。
Perhaps you can test with a sample RTD server instead of your own, just to confirm that the error is there and not in the wrapper or elsewhere in the VSTO add-in. Then you can dig into your RTD server to see what goes wrong.
-Govert
的 - 洒脱.NET为Excel
Excel-DNA - Free and easy .NET for Excel
这篇关于调用从Excel RTD服务器时异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!