简体   繁体   中英

Unable to cast object … to type

Visual Studio 2008 (C#) created the Interop for my COM objects. The main objects which I am using are: OPCHDAServerClass , IOPCHDAItems , and OPCHDAItem . The code is:

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

In the third line the AddItem method should return an OPCHDAItem . The interop definition for AddItem is:

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

The exception that I get is:

Unable to cast object of type 'OPCHDAServerClass' to type 'IOPCHDAItems'.

I do not understand why I am getting this error message. server.OPCHDAItems implements IOPCHDAItems . I do not know why server ( OPCHDAServerClass ) is being cast to IOPCHDAItems ?

I did initial prototyping in python which worked fine so I know that the COM components are functional. This is the python code:

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

Has anyone seen a similar issue and know of a work around?

Looks like the declared type of property OPCHDAItems is not IOPCHDAItems - it's OPCHDAServerClass . C# is a statically typed language - it won't typecast COM interfaces unless explicitly told to, and it won't go for the IDispatch unless told to. Rephrase like this:

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

EDIT: try this first:

IOPCHDAItems Items = server.OPCHDAItems;

Still the same error? How about

IOPCHDAItems Items = server.OPCHDAItems as IOPCHDAItems;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM