繁体   English   中英

DllImport 事件 Arguments 在 C# 中编组 Function

[英]DllImport Event Arguments Marshalling for Function in C#

我对使用 DllImport 和编组真的很陌生。 我已经阅读了 Microsoft 的文档,并通过反复试验获得了我需要的大部分内容,但在使用大 function 时遇到了困难。我什至不确定从哪里开始。

这是 C header:

extern EXPORT int kt10_library_init(void);
extern EXPORT int kt10_list_usb_devices(kt10_conn_string_t *list, int max_devices, int *dev_count);
extern EXPORT int kt10_connect(kt10_conn_string_t conn_string, int *id_conn, int timeout,
                        int (*event_connected)(int,char *,void *),
                        int (*event_connection_error)(int, char *,void *),
                        int (*event_disconnected)(int,char *,void *),
                        int (*event_live_data)(int,char *,int,int,float,float,void *),
                        void *user_data);

这是我目前在 C# 中有效的代码

[DllImport("libkt10int.dll")] private static extern int kt10_library_init();
[DllImport("libkt10int.dll")] private static extern int kt10_list_usb_devices([In,Out] char[] list, int max_devices, ref UInt32 dev_count);
[DllImport("libkt10int.dll")] private static extern int kt10_connect(char[] conn_string, ref UInt32 id_conn, int timeout,...

但我对k10_connect function 中的(事件)内容感到困惑。有人有某种文档可以指导我或指导我如何编写吗? 我什至不确定我应该寻找什么。 除了 header 之外,我没有太多关于 go 的信息。

这是我正在阅读的一些文档https://learn.microsoft.com/en-us/do.net/api/system.runtime.interopservices.dllimportattribute?view.net-6.0

更新 1好的,根据我正在为那些 arguments 创建代表的评论,这给了我一个起点,但我遇到了 memory 访问冲突。 不幸的是,我无权访问任何文档。 该库不打算开源。

[DllImport("libkt10int.dll")] private static extern int kt10_connect(
        char[] conn_string, 
        ref UInt32 id_conn, 
        int timeout, 
        ref event_connected onConnected,
        ref event_connection_error onConnectionError,
        ref event_disconnected onDisconnected,
        ref event_live_data onLiveData,
        ref unknown onUserData);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int event_connected(int id,ref char conChar,ref unknown fun);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int event_connection_error(int id,ref char conChar,ref unknown fun);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int event_disconnected(int id,ref char conChar,ref unknown fun);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int event_live_data(int id, ref char conChar, int num1, int num2, float num3, float num4, ref unknown fun);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void unknown();

public static void Connect(string device)
{
    UInt32 connId = 0;
    var Unknown = new unknown(OnUnknown);
    var connectedEvent = new event_connected(Event);
    var connectionErrorEvent = new event_connection_error(Event);
    var disconnectedEvent = new event_disconnected(Event);
    var liveDataEvent = new event_live_data(EventLiveData);
    kt10_connect(device.ToCharArray(), ref connId, 1000, ref connectedEvent, ref connectionErrorEvent, ref disconnectedEvent, ref liveDataEvent, ref Unknown);
    Debug.WriteLine("Attempting connection");
}

感谢评论中的每个人对代表的帮助。 这正是我让 function 工作所需要的。 我能够取回连接 ID 并使用它来获取设备的序列号!

我可能还有更多工作要做,但这主要是让程序运行所需的。

private const int KT10V2_MAX_CONNECTION_STR_LEN = 128;
    //private char[] 
    [DllImport("libkt10int.dll")] private static extern int kt10_library_init();
    [DllImport("libkt10int.dll")] private static extern int kt10_list_usb_devices([In,Out] char[] list, int max_devices, ref UInt32 dev_count);
    [DllImport("libkt10int.dll")] private static extern int kt10_get_serial(uint connectionID, [In, Out] char[] serialNumber);
    [DllImport("libkt10int.dll")] private static extern int kt10_connect(
        char[] conn_string, 
        ref UInt32 id_conn, 
        int timeout, 
        event_connected onConnected,
        event_connection_error onConnectionError,
        event_disconnected onDisconnected,
        event_live_data onLiveData,
        unknown onUserData);

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    private delegate int event_connected(int id,ref char conChar, unknown fun);

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    private delegate int event_connection_error(int id,ref char conChar, unknown fun);

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    private delegate int event_disconnected(int id,ref char conChar, unknown fun);

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    private delegate int event_live_data(int id, ref char conChar, int num1, int num2, float num3, float num4, unknown fun);

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    private delegate void unknown();

    static readonly unknown Unknown = new(OnUnknown);
    static readonly event_connected connectedEvent = new(Event);
    static readonly event_connection_error connectionErrorEvent = new(Event);
    static readonly event_disconnected disconnectedEvent = new(Event);
    static readonly event_live_data liveDataEvent = new(EventLiveData);
    public static uint Connect(string device)
    {
        UInt32 connId = 0;
        kt10_connect(device.ToCharArray(), ref connId, 1000, connectedEvent,  connectionErrorEvent, disconnectedEvent, liveDataEvent, Unknown);
        return connId;
    }
    public static string GetSerial(uint connectionID)
    {
        var serialNumber = new char[KT10V2_MAX_CONNECTION_STR_LEN];
        kt10_get_serial(connectionID, serialNumber);
        return new string(serialNumber);
    }
    public static void InitKTLibrary()
    {
        kt10_library_init();
    }

    public static string[] ListUSBDevices(int maxDevices = 99)
    {
        UInt32 devCount = 0;
        var list = new char[KT10V2_MAX_CONNECTION_STR_LEN];
        kt10_list_usb_devices(list, maxDevices, ref devCount);
        var resultString = new string(list);
        resultString = resultString.Trim();
        if (devCount == 0)
            return Array.Empty<string>();
        return resultString.Split(Environment.NewLine);
    }

    private static void OnUnknown()
    {
    
    }


    private static int Event(int id, ref char conChar, unknown fun)
    {
        return -1;
    }

    private static int EventLiveData(int id, ref char conChar, int num1, int num2, float num3, float num4, unknown fun)
    {
        return -1;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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