Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
没有windows DLL的C#和HID_C#_.net_Dll_Mono_Hid - Fatal编程技术网

没有windows DLL的C#和HID

没有windows DLL的C#和HID,c#,.net,dll,mono,hid,C#,.net,Dll,Mono,Hid,我正在用C#开发一个监控系统,它通过RS485控制器连接到一些仪器。该控制器由微芯片处理器制成,Windows操作系统将其识别为HID设备(USB即插即用)。 也就是说,我使用Windows dll函数(hid.dll)进行开发,如下代码块所示: [DllImport("hid.dll", SetLastError = true)] public static extern void HidD_GetHidGuid(ref Guid hidGuid); [DllImpo

我正在用C#开发一个监控系统,它通过RS485控制器连接到一些仪器。该控制器由微芯片处理器制成,Windows操作系统将其识别为HID设备(USB即插即用)。 也就是说,我使用Windows dll函数(hid.dll)进行开发,如下代码块所示:

    [DllImport("hid.dll", SetLastError = true)]
    public static extern void HidD_GetHidGuid(ref Guid hidGuid);

    [DllImport("hid.dll", SetLastError = true)]
    public static extern bool HidD_GetNumInputBuffers(SafeFileHandle hidDeviceObject, ref Int32 numberBuffers);

    [DllImport("hid.dll", SetLastError = true)]
    public static extern bool HidD_GetPreparsedData(SafeFileHandle hidDeviceObject, ref IntPtr preparsedData);
今天,我正在研究将这个应用程序移植到使用Mono的Linux操作系统(Debian发行版),我相信Linux不会使用这些调用,因为它基于Windows操作系统


有没有其他方法可以在不使用这些DLL的情况下将HID设备与C#集成?或者,您是否知道如何实现这一点?

您需要做的是找到一个通用接口,该接口位于您将要瞄准的所有Hid平台上。如果您提出了一个通用接口,那么您可以在每个平台上实现该接口,或者封装已经为这些平台编写的库。这就是如何实现依赖注入()的基础

您提到的API调用对Windows非常有用,但在其他平台上则完全不同

下面是my library()中的一个基本示例:

公共接口IHidDevice:IDisposable
{
/// 
///在设备成功连接后发生。注意:这可以调用多次,并且每次调用InitializeAsync成功时都会发生。
/// 
事件处理程序已连接;
/// 
///占位符。当前未使用此占位符。请暂时不要依赖此占位符。
/// 
事件处理程序断开连接;
/// 
///检查设备是否已成功连接。注意:检查实现以查看此方法是否实际询问设备是否仍在连接
/// 
任务GetIsConnectedAsync();
/// 
///阅读一页数据
/// 
任务ReadAsync();
/// 
///写一页数据
/// 
任务WriteAsync(字节[]数据);
/// 
///设备的供应商Id
/// 
int VendorId{get;}
/// 
///设备的产品Id
/// 
int ProductId{get;}
/// 
///处理所有现有连接并重新初始化设备
/// 
任务初始化同步();
}
该库已经支持Windows、Android和UWP。下面是使用您提到的一些API的示例实现:

此外,这个旧的Hid库支持Linux,但不使用基于任务的异步。也许您可以从那里获取Linux代码


我会开始在UHID周围闲逛。嗨@dna,谢谢你的帮助。。我在这个链接上发现了一个有趣的库:我现在正在尝试使用它
   public interface IHidDevice : IDisposable
        {
            /// <summary>
            /// Occurs after the device has successfully connected. Note: this can be called multiple times and will occurr every time  InitializeAsync is called successfull. 
            /// </summary>
            event EventHandler Connected;

            /// <summary>
            /// Placeholder. This is not currently being used. Please do not rely on this at the moment.
            /// </summary>
            event EventHandler Disconnected;

            /// <summary>
            /// Checks to see if the device has been successfully connected. Note: check the implementation to see if this method is actually asking the device whether it is still connected or not
            /// </summary>
            Task<bool> GetIsConnectedAsync();

            /// <summary>
            /// Read a page of data
            /// </summary>
            Task<byte[]> ReadAsync();

            /// <summary>
            /// Write a page of data
            /// </summary>
            Task WriteAsync(byte[] data);

            /// <summary>
            /// The device's Vendor Id
            /// </summary>
            int VendorId { get; }

            /// <summary>
            /// The device's Product Id
            /// </summary>
            int ProductId { get; }

            /// <summary>
            /// Dispose of any existing connections and reinitialize the device
            /// </summary>
            Task InitializeAsync();
    }