无法将对象转换为类型...

3

Visual Studio 2008(C#)为我的COM对象创建了Interop。 我正在使用的主要对象是:OPCHDAServerClassIOPCHDAItemsOPCHDAItem。 代码如下:

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

在第三行中,AddItem方法应该返回一个OPCHDAItemAddItem的Interop定义如下:

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

我得到的异常是:
无法将类型为“OPCHDAServerClass”的对象强制转换为类型“IOPCHDAItems”。
我不明白为什么会出现这个错误消息。server.OPCHDAItems实现了IOPCHDAItems。我不知道为什么server(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的属性? - user1610015
避免使用以“Class”结尾的类型名称。它们是合成类型,在COM服务器中实际上并不存在,有时可能会引起麻烦。尝试使用new操作符创建OPCHDAServer或IOPCHDAServer。 - Hans Passant
你能进入生成的COM吗? - silverjam
我正在使用的 COM 对象并非由我开发。它们是购买的软件平台的一部分。我只是在 VS2008 中使用“添加引用”让 VS2008 为它们创建了互操作性。根据汉斯评论的一部分,OPCHDAServerClass 就是互操作性创建出来的内容。我已更正了上面的问题。那里列出的代码是真实的代码,不是伪代码。我在运行 Makepy 后将我的 Python 代码添加到了问题中。 - zam664
1个回答

0
看起来 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)的属性,但不能访问另一个对象。 - zam664

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接