Excel RTD COM服务器 - 无法将UpdateEvent(类)强制转换为IRTDUpdateEvent(接口)

此问题与Kenny Kerr关于“Excel RTD Servers:C#Interfaces”的博客文章相关,可以在此处找到,该文章应该允许您构建Excel RTD服务器,而不包括对任何特定Excel类型库的引用;必须包含一个引用使您的RTD服务器Excel版本特定(前向兼容,但不向后兼容,我相信)。对Excel类型库没有任何依赖性简化了RTD到具有不同版本的Excel(XP,2003,2007和2010)的计算机的部署。 现在,没有RTD引用特定的Excel类型库来获取接口IRtdServer和IRTDUpdateEvent是非常好的。但是我有时间让Kenny的建议工作。 这就是我所做的:
1) Added IRtdServer.cs and IRTDUpdateEvent.cs to my RTD project and put the interface definitions from your blog into those files (not changing the GUIDs).
2) Removed any reference to an Excel type library.
3) Build and regasm OK.
我在VBA和VBScript中有一些小测试工具,它通过模拟Excel对RTD的调用来测试我的MyRTD.dll RTD服务器。以下是代码的相关代码段: 第一个VBA:
Const RTDProgID As String = "MyRTD.RTD"
Const UpdateEventProgID As String = "MyRTD.UpdateEvent"

' Create the RTD server object.
Dim rtd As Object
Set rtd = CreateObject(RTDProgID)

' Start the RTD server, passing in a callback object.
Dim callback As Object
Set callback = CreateObject(UpdateEventProgID)
Dim status As Long
status = rtd.ServerStart(callback)    <----    Fails here.
此代码在最后一行失败,并显示“无法将MyRTD.UpdateEvent转换为MyRTD.IRTDUpdateEvent”的消息。虽然类UpdateEvent实现了接口IRTDUpdateEvent。 第二个VBScript:
' ProgIDs for COM components.
Const RTDProgID = "MyRTD.RTD"
Const UpdateEventProgID = "MyRTD.UpdateEvent"

' Real-time data (RTD) object
Dim rtd
Set rtd = CreateObject(rtdID)

' Callback object. This is how
' the RTD would notify Excel of
' new data updates.
Dim callback
Set callback = CreateObject(UpdateEventProgID)

' Start the RTD server, passing in
' the callback object.
Dim status
status = rtd.ServerStart(callback)    <----    Fails here.
此代码在最后一行失败,消息沿着“无效的过程调用或参数”(我认为回调的结果是错误的类型/接口)。 任何帮助,将不胜感激。
             Best regards, Andrew Sheppard
    
已邀请:
在对此进行了一些更多的工作并与Kenny Kerr交换了一些电子邮件后,很明显问题出现了,因为具有相同GUID和使用ComImport的接口如果在不同的程序集中定义,则不会被视为相同的东西,即使已定义相同。 我有一个进程内(DLL)和进程外(EXE)实时数据(RTD)服务器共享完全相同的代码库;也就是说,相同的RTD,不同的执行模型。我已经使用IRTDUpdateEvent并将其放入自己的程序集中。当然,IRTDUpdateEvent是由Excel对象库实现的;但我自己定义它,所以我不必让我的RTD依赖于特定版本的Excel(2002,2003,2007,2010),使部署更简单。 如果因为“类型等价”的新功能而使用C#4.0,这不会成为问题。您可以使具有相同GUID的类/接口表现得就像存在相同(更有意义),无论它们在何处定义。但我的目标平台是4.0之前的版本。 解决方法是将IRTDUpdateEvent从其自己的程序集移回DLL和EXE程序集。完成后,DLL和EXE RTD服务器都可以使用Excel和VBA以及VBScript和C#客户端。     

要回复问题请先登录注册