gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:20:30 27 4
gpt4 key购买 nike

此问题与 Kenny Kerr 在“Excel RTD 服务器:C# 接口(interface)”上的博文有关,该博文可在 here 中找到。 ,这应该允许您在不包含对任何特定 Excel 类型库的引用的情况下构建 Excel RTD 服务器;必须包含引用使您的 RTD 服务器 Excel 版本特定(我相信向前兼容,但不向后兼容)。不依赖 Excel 类型库可简化将 RTD 部署到具有不同 Excel 版本(XP、2003、2007 和 2010)的机器上。

现在,没有 RTD 引用特定的 Excel 类型库来获取接口(interface) 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.

此代码在最后一行失败,消息为“无法将 MyRTD.UpdateEvent 转换为 MyRTD.IRTDUpdateEvent”。虽然类 UpdateEvent 实现了接口(interface) 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.

此代码在最后一行失败,消息沿“无效的过程调用或参数”行(我假设回调的结果是错误的类型/接口(interface))。

任何帮助,将不胜感激。
             Best regards, Andrew Sheppard

最佳答案

在对此进行了更多工作并与 Kenny Kerr 交换了一些电子邮件之后,很明显问题出现了,因为具有相同 GUID 和使用 ComImport 的接口(interface)如果在不同的程序集中定义,即使已定义,它们也不会被视为同一事物同样。

我有一个进程内 (DLL) 和进程外 (EXE) 实时数据 (RTD) 服务器,它们共享完全相同的代码库;也就是说,相同的 RTD,不同的执行模型。我采用了 IRTDUpdateEvent 并将其放入自己的程序集中。 IRTDUpdateEvent 当然是由 Excel 对象库实现的;但我自己定义了它,因此我不必让我的 RTD 依赖于特定版本的 Excel(2002、2003、2007、2010),从而使部署更简单。

如果我使用 C# 4.0,这将不是问题,因为“类型等效”的新特性。您可以使具有相同 GUID 的类/接口(interface)表现得好像存在相同(这更有意义),而不管它们是在哪里定义的。但我的目标平台是 4.0 之前的版本。

修复方法是将 IRTDUpdateEvent 从其自己的程序集中移回 DLL 和 EXE 程序集。完成后,DLL 和 EXE RTD 服务器都可以与 Excel 和 VBA 以及 VBScript 和 C# 客户端一起使用。

关于c# - Excel RTD COM 服务器 - 无法将 UpdateEvent(类)转换为 IRTDUpdateEvent(接口(interface)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3954163/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com