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

C# Excel RTD COM服务器-无法将UpdateEvent(类)强制转换为IRTDUpdateEvent(接口),c#,excel,interface,casting,rtd,C#,Excel,Interface,Casting,Rtd,本期文章与Kenny Kerr在“Excel RTD服务器:C#Interface”上发表的一篇博文有关,该博文可以让您构建Excel RTD服务器,而无需引用任何特定的Excel类型库;必须包含引用才能使RTD服务器的Excel版本特定(我相信是向前兼容,但不是向后兼容)。不依赖Excel类型库可以简化RTD在具有不同版本Excel(XP、2003、2007和2010)的计算机上的部署 现在,不使用RTD引用特定Excel类型库来获取接口IRtdServer和IRTDUpdateEvent非常

本期文章与Kenny Kerr在“Excel RTD服务器:C#Interface”上发表的一篇博文有关,该博文可以让您构建Excel RTD服务器,而无需引用任何特定的Excel类型库;必须包含引用才能使RTD服务器的Excel版本特定(我相信是向前兼容,但不是向后兼容)。不依赖Excel类型库可以简化RTD在具有不同版本Excel(XP、2003、2007和2010)的计算机上的部署

现在,不使用RTD引用特定Excel类型库来获取接口IRtdServer和IRTDUpdateEvent非常好。但我真是费了好大劲才让肯尼的建议奏效

以下是我所做的:

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.

在这方面做了更多的工作并与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#客户端一起工作。

在做了更多的工作并与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#客户端一起工作

' 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