0

我正在使用 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 经验的人?

当这个定时器

4

1 回答 1

0

我想知道是否Message在与创建canreceiver.

你知道线程模型CANSUPPORTLib.CanIO吗?如果它是单元线程的,您可能需要将主 UI 线程的引用编组到以Message某种方式调用的线程。

或者,假设您可以更改 C++ dll 的源代码,并且根据您的其他线程要求和约束,您可以将其更改为自由线程,在这种情况下,可以从多个线程同时访问一个对象而无需编组。

于 2010-03-19T07:48:40.000 回答