我正在使用C / C ++编写的Dll在c#中创建一个工具来检索CAN网络(汽车中的网络)的消息。这个DLL可用作COM接口。
我的c#-formclass实现了其中一个COM接口。其他变量使用这些COM接口进行实例化(一切都很完美)。
问题:我的C#-form实现的接口有3个抽象函数。其中一个函数被称为-dll-我需要自己实现它。在这个函数中,我希望检索一个COM类型的表单范围变量的属性。
COM库是CANSUPPORTLib
表单范围的变量:
private CANSUPPORTLib.ICanIOEx devices = new CANSUPPORTLib.CanIO();
此变量也是表单范围的,并通过devices-variable:
检索canreceiver = (CANSUPPORTLib.IDirectCAN2)devices.get_DirectDispatch(receiverLogicalChannel);
由dll调用并在c#
中实现的函数 public void Message(double dTimeStamp)
{
Console.WriteLine("!!! message ontvangen !!!" + Environment.NewLine);
try
{
CANSUPPORTLib.can_msg_tag message = new CANSUPPORTLib.can_msg_tag();
message = (CANSUPPORTLib.can_msg_tag)System.Runtime.InteropServices.Marshal.PtrToStructure(canreceiver.RawMessage, message.GetType());
for (int i = 0; i < message.data.Length; i++)
{
Console.WriteLine("byte " + i + ": " + message.data[i]);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
错误在这一行上升:
message = (CANSUPPORTLib.can_msg_tag)System.Runtime.InteropServices.Marshal.PtrToStructure(canreceiver.RawMessage, message.GetType());
错误:
Unable to cast COM object of type 'System.__ComObject' to interface type CANSUPPORTLib.IDirectCAN2'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{33373EFC-DB42-48C4-A719-3730B7F228B5}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
注意: 可以有一个定时器时钟,每100ms检查一次我需要的消息。然后以与我现在完全相同的方式检索消息。表单启动时启动此计时器。仅当Message(double)将变量设置为true(消息到达)时才进行检查。
当在消息功能中启动定时器时钟时,我有与上面相同的错误
表单启动时启动另一个线程也是不可能的。
是否有人有COM-interop经验?
当这个计时器
答案 0 :(得分:0)
我想知道是否在与创建Message
的线程不同的线程上调用了canreceiver
。
你知道CANSUPPORTLib.CanIO
的线程模型吗?如果它是单元线程的,您可能需要将主UI线程中的引用封送到Message
以某种方式调用的线程。
或者,假设您可以更改C ++ dll的源代码,并根据您的其他线程要求和约束,您可以将其更改为自由线程,在这种情况下,可以从多个线程同时访问对象编组。