我正在使用 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();
此变量也是表单范围的,并通过设备变量检索:
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)).
注意:可以有一个定时器时钟,每 100 毫秒检查一次我需要的消息。然后以与我现在完全相同的方式检索该消息。此计时器在表单启动时启动。仅当 Message(double) 将变量设置为 true(消息到达)时才进行检查。
在消息功能中启动定时器时钟时,我遇到与上述相同的错误
在表单启动时启动另一个线程也是不可能的。
有没有 COM-interop 经验的人?
当这个定时器