【问题标题】:Unable to cast object ... to type无法投射对象...键入
【发布时间】:2013-01-08 22:20:56
【问题描述】:

Visual Studio 2008 (C#) 为我的 COM 对象创建了互操作。我使用的主要对象是:OPCHDAServerClassIOPCHDAItemsOPCHDAItem。代码是:

OPCHDAServerClass server = new OPCHDAServerClass();
server.Connect("OPC.PHDServerHDA.1");
OPCHDAItem item = server.OPCHDAItems.AddItem("MyItem",1);

在第三行,AddItem 方法应该返回一个OPCHDAItemAddItem 的互操作定义为:

[DispId(1610743813)]
OPCHDAItem AddItem(string ItemID, int ClientHandle);

我得到的例外是:

无法将“OPCHDAServerClass”类型的对象转换为“IOPCHDAItems”类型。

我不明白为什么会收到此错误消息。 server.OPCHDAItems 实现 IOPCHDAItems。我不知道为什么服务器(OPCHDAServerClass)被转换为IOPCHDAItems

我在 python 中进行了初始原型设计,效果很好,所以我知道 COM 组件是正常工作的。这是python代码:

server = win32com.client.dynamic.Dispatch("Uniformance.OPCHDA.Automation.1")
server.Connect("OPC.PHDServerHDA.1")
item = server.OPCHDAItems.AddItem("MyItem", 1)

有没有人看到类似的问题并知道解决方法?

【问题讨论】:

  • 您说这是您在伪代码中所做的,但您的实际代码是什么?另外,OPCHDAServerClass 是否真的有一个名为 OPCHDAItems 的属性?
  • 避免使用以“Class”结尾的类型名称。它们是 COM 服务器中实际不存在的合成类型,在某些情况下可能会导致此类问题。尝试新的 OPCHDAServer 或 IOPCHDAServer
  • 你能进入生成的COM吗?
  • 我使用的 COM 对象不是我开发的。它们是购买的软件平台的一部分。我刚刚使用 VS2008 中的“添加引用”让 VS2008 为它们创建互操作。作为汉斯评论的一部分。 OPCHDAServerClass 是互操作创建的。我纠正了我上面的问题。那里列出的代码是真实代码,而不是伪代码。我的 python 代码(在运行 Makepy 之后)被添加到问题中。

标签: c# com activex


【解决方案1】:

看起来 已声明 类型的属性 OPCHDAItems 不是 IOPCHDAItems - 它是 OPCHDAServerClass。 C# 是一种静态类型语言——除非明确告知,否则它不会对 COM 接口进行类型转换,除非告知,否则它不会使用 IDispatch。改写如下:

server.Connect("MyServerName");
OPCHDAItem item = (server.OPCHDAItems as IOPCHDAItems).AddItem("MyItem",1);

编辑:先试试这个:

IOPCHDAItems Items = server.OPCHDAItems;

还是同样的错误?怎么样

IOPCHDAItems Items = server.OPCHDAItems as IOPCHDAItems;

【讨论】:

  • 还是同样的错误。它仍在尝试强制转换 OPCHDAServerClass。它的行为就像它无法访问服务器对象中的对象。我可以在服务器中访问具有简单数据类型(如 int 和 string)的属性,但不能访问其他对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
相关资源
最近更新 更多