Usb.Events 10.1.1.1

There is a newer version of this package available.
See the version list below for details.
dotnet add package Usb.Events --version 10.1.1.1                
NuGet\Install-Package Usb.Events -Version 10.1.1.1                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Usb.Events" Version="10.1.1.1" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Usb.Events --version 10.1.1.1                
#r "nuget: Usb.Events, 10.1.1.1"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Usb.Events as a Cake Addin
#addin nuget:?package=Usb.Events&version=10.1.1.1

// Install Usb.Events as a Cake Tool
#tool nuget:?package=Usb.Events&version=10.1.1.1                

Usb.Events

Subscribe to the Inserted and Removed events to be notified when a USB drive is plugged in or unplugged, or when a USB device is connected or disconnected. Usb.Events is a .NET Standard 2.0 library and uses WMI on Windows, libudev on Linux and IOKit on macOS.

How to use:

  1. Include NuGet package from https://www.nuget.org/packages/Usb.Events

     <ItemGroup>
         <PackageReference Include="Usb.Events" Version="10.1.1.1" />
     </ItemGroup>
    
  2. Subscribe to events:

     using Usb.Events;
    
     class Program
     {
         static void Main(string[] _)
         {
             using IUsbEventWatcher usbEventWatcher = new UsbEventWatcher();
    
             usbEventWatcher.UsbDeviceRemoved += (_, device) => Console.WriteLine("Removed:" + Environment.NewLine + device + Environment.NewLine);
    
             usbEventWatcher.UsbDeviceAdded += (_, device) => Console.WriteLine("Added:" + Environment.NewLine + device + Environment.NewLine);
    
             usbEventWatcher.UsbDriveEjected += (_, path) => Console.WriteLine("Ejected:" + Environment.NewLine + path + Environment.NewLine);
    
             usbEventWatcher.UsbDriveMounted += (_, path) =>
             {
                 Console.WriteLine("Mounted:" + Environment.NewLine + path + Environment.NewLine);
    
                 foreach (string entry in Directory.GetFileSystemEntries(path))
                     Console.WriteLine(entry);
    
                 Console.WriteLine();
             };
    
             Console.ReadLine();
         }
     }
    

Constructor parameters:

UsbEventWatcher(
    bool startImmediately = true, 
    bool addAlreadyPresentDevicesToList = false, 
    bool usePnPEntity = false, 
    bool includeTTY = false)
  • Set startImmediately to false if you don't want to start immediately, then call Start(bool includeTTY = false).
  • Set addAlreadyPresentDevicesToList to true if you want UsbDeviceList to include devices that were already present.
  • Set usePnPEntity to true if you want the watcher to query Win32_PnPEntity instead of Win32_USBControllerDevice.
  • Set includeTTY to true if you want to monitor the TTY subsystem in Linux (besides the USB subsystem).

Using Win32_PnPEntity vs Win32_USBControllerDevice

  • Win32_PnPEntity
    • PRO: works for all devices
    • CON: is CPU intensive
    • CON: uses only 2 methods to find MountedDirectoryPath for storage devices (this should still work for most devices)
  • Win32_USBControllerDevice
    • PRO: uses 3 methods to find MountedDirectoryPath for storage devices
    • PRO: in not CPU intensive
    • CON: for some devices it can stop reporting UsbDeviceAdded event after the device is added and removed a few times

Using Win32_USBControllerDevice is usually the better option.

Example:

Usb.Events.Example demonstrates how to use Windows SetupAPI.dll functions SetupDiGetClassDevs, SetupDiEnumDeviceInfo and SetupDiGetDeviceProperty together with DEVPKEY_Device_DeviceDesc, DEVPKEY_Device_BusReportedDeviceDesc and DEVPKEY_Device_FriendlyName to get "Device description", "Bus reported device description" and "Friendly name" of the Usb.Events.UsbDevice reported by the Usb.Events.IUsbEventWatcher.UsbDeviceAdded event.

How to build:

Usb.Events.csproj uses gcc to build UsbEventWatcher.Mac.dylib from UsbEventWatcher.Mac.c when run on macOS and to build UsbEventWatcher.Linux.so from UsbEventWatcher.Linux.c when run on Linux.

  <Target Name="BuildNonWindowsNative" Condition="'$(OS)' != 'Windows_NT'" BeforeTargets="Build">
    <Exec Condition="'$(IsMacOS)' == 'true'"
          WorkingDirectory=".\"
          Command="gcc -shared ./Mac/UsbEventWatcher.Mac.c -o UsbEventWatcher.Mac.dylib -framework CoreFoundation -framework DiskArbitration -framework IOKit" />
    <Exec Condition="'$(IsMacOS)' != 'true'"
          WorkingDirectory=".\"
          Command="gcc -shared ./Linux/UsbEventWatcher.Linux.c -o UsbEventWatcher.Linux.so -ludev -fPIC" />
  </Target>

Usb.Events.dll expects to find UsbEventWatcher.Linux.so and UsbEventWatcher.Mac.dylib in the working directory when it runs, so make sure to build the project on Linux and Mac before building the NuGet package on Windows.

TO DO:

  • Automatically mount USB drive on UsbDeviceAdded event in Linux
  • Automatically mount USB drive on UsbDeviceAdded event in macOS

Version history:

  • 10.1.1.1:
    • Fixed Dispose() to exit native monitor loop in macOS
  • 10.1.1.0:
    • Fixed Dispose() to exit native monitor loop in Linux
    • Added bool usePnPEntity to use Win32_PnPEntity in Windows
  • 10.1.0.1:
    • Added bool addAlreadyPresentDevicesToList in Windows
  • 10.1.0.0:
    • Updated System.Management package reference from 4.7.0 to 7.0.0
  • 10.0.1.1:
    • Added bool startImmediately = true to UsbEventWatcher constructor
    • Added void Start(bool includeTTY = false) to IUsbEventWatcher
  • 10.0.1.0:
    • Added bool includeTTY = false to UsbEventWatcher constructor
    • Fixed a EnumerateDevices bug in Linux - thanks to @d79ima
  • 10.0.0.1:
    • Fixed a false "device added" events bug in Linux - thanks to @d79ima
  • 10.0.0.0:
    • Fixed a NullReferenceException in Linux and macOS - by @thomOrbelius
  • 1.1.1.1:
    • Fixed a bug in Windows where MountedDirectoryPath wasn't set for a disk drive - thanks to @cksoft0807
  • 1.1.1.0:
    • Fixed a memory leak in Linux function GetLinuxMountPoint - by @maskimthedog
    • Fixed a bug in Linux where after instantiating UsbEventWatcher, the list of devices was empty - by @maskimthedog
    • Added monitoring of TTY subsystem in Linux - by @maskimthedog
    • Fixed a bug in Linux where monitoring would stop upon error - by @maskimthedog
  • 1.1.0.1:
    • Fixed a bug
  • 1.1.0.0:
    • Added:
      • MountedDirectoryPath
      • IsMounted
      • IsEjected
    • Breaking changes:
      • DevicePath renamed to DeviceSystemPath
      • UsbDriveInserted renamed to UsbDriveMounted
      • UsbDriveRemoved renamed to UsbDriveEjected
      • UsbDeviceInserted renamed to UsbDeviceAdded
  • 1.0.1.1:
    • Fixed a bug
  • 1.0.1.0:
    • Events for all USB devices
  • 1.0.0.1:
    • Fixed a bug
  • 1.0.0.0:
    • Events for USB drives and USB storage devices
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Usb.Events:

Package Downloads
xyxandwxx.Android

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
11.1.0.1 20,019 1/5/2024
11.1.0 2,022 11/30/2023
11.0.1.1 352 11/17/2023
11.0.1 6,641 7/29/2023
11.0.0.1 450 7/21/2023
11.0.0 351 7/16/2023
10.1.1.1 669 6/4/2023
10.1.1 183 5/31/2023
10.1.0.1 589 4/21/2023
10.1.0 320 4/15/2023
10.0.1.1 13,128 11/9/2021
10.0.1 460 11/1/2021
10.0.0.1 374 10/31/2021
10.0.0 668 7/2/2021
1.1.1.1 7,229 2/13/2021
1.1.1 397 2/1/2021
1.1.0.1 824 9/19/2020
1.1.0 3,730 8/1/2020
1.0.1.1 814 7/10/2020
1.0.1 1,425 7/4/2020 1.0.1 is deprecated because it has critical bugs.
1.0.0.1 494 7/7/2020
1.0.0 2,837 4/28/2020