C# 无法强制转换对象。。。打字

C# 无法强制转换对象。。。打字,c#,com,activex,C#,Com,Activex,Visual Studio 2008(C#)为我的COM对象创建了互操作。我使用的主要对象是:OPCHDAServerClass,iopcdaitems,以及OPCHDAItem。代码是: OPCHDAServerClass server = new OPCHDAServerClass(); server.Connect("OPC.PHDServerHDA.1"); OPCHDAItem item = server.OPCHDAItems.AddItem("MyItem",1); 在第三行中,

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

OPCHDAServerClass server = new OPCHDAServerClass();
server.Connect("OPC.PHDServerHDA.1");
OPCHDAItem item = server.OPCHDAItems.AddItem("MyItem",1);
在第三行中,
AddItem
方法应该返回一个
OPCHDAItem
AddItem
的互操作定义为:

[DispId(1610743813)]
OPCHDAItem AddItem(string ItemID, int ClientHandle);
我得到的例外是:

无法将类型为“OPCHDAServerClass”的对象强制转换为类型为“IOPCDAITEMS”

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

我用python做了初始原型设计,效果很好,所以我知道COM组件是功能性的。这是python代码:

server = win32com.client.dynamic.Dispatch("Uniformance.OPCHDA.Automation.1")
server.Connect("OPC.PHDServerHDA.1")
item = server.OPCHDAItems.AddItem("MyItem", 1)
有人见过类似的问题并知道解决方法吗?

看起来声明的属性类型
OPCHDAItems
不是
iopcdaitems
-它是
opchdaserveclass
。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;

你说这是你在peudo代码中所做的,但你实际的代码是什么?另外,OPCHDAServerClass是否确实有一个名为OPCHDAItems的属性?请避免使用以“Class”结尾的类型名称。它们是COM服务器中实际不存在的合成类型,在某些情况下可能会导致类似的问题。尝试新建一个OPCHDAServer或一个iopcdaserver您可以介入生成的COM吗?我正在使用的COM对象不是我开发的。它们是购买的软件平台的一部分。我刚刚在VS2008中使用了“添加引用”,让VS2008为它们创建互操作。作为汉斯评论的一部分。OPCHDAServerClass是interop创建的。我纠正了上面的问题。这里列出的代码是真实代码,而不是伪代码。我的python代码(在运行Makepy之后)被添加到问题中。仍然是相同的错误。它仍在尝试强制转换OpchDaseServer类。它的行为就像无法访问服务器对象中的对象一样。我可以在服务器中使用简单的数据类型(如int和string)访问属性,但不能访问其他对象。