Guten Tag,
ich habe in meinem Projekt Hardware auf die ich über USB (mittels LibUSB) aus C# heraus zugreife. Der Zugriff klappt soweit auch. Jetzt habe ich eine die entsprechende Klasse dafür als Singleton vorgesehen. Zusätzlich soll die aber auch IDisposable implementieren um die Verbindung zu schließen.
Spoiler anzeigen
Eigentlich müsste ich so doch im gesamten Programm auf
Grüße
ich habe in meinem Projekt Hardware auf die ich über USB (mittels LibUSB) aus C# heraus zugreife. Der Zugriff klappt soweit auch. Jetzt habe ich eine die entsprechende Klasse dafür als Singleton vorgesehen. Zusätzlich soll die aber auch IDisposable implementieren um die Verbindung zu schließen.
C#-Quellcode
- public class UsbMotorDriver : IDisposable
- {
- const string libName = "libusb0.dll";
- const short vid = 0x16c0, pid = 0x05dc;
- IntPtr usbDevHandle = IntPtr.Zero;
- // Es folgen diverse P/Invoke Calls
- static UsbMotorDriver usbDriver = null;
- public static UsbMotorDriver Instance
- {
- get
- {
- if (usbDriver == null)
- usbDriver = new UsbMotorDriver();
- return usbDriver;
- }
- }
- public void ConnectHardware()
- {
- usbDevHandle = ...
- }
- public bool TryConnectHardware()
- {
- usbDevHandle = ...
- }
- public unsafe byte[] SendRequest(UsbRequestType request, int value, int index)
- {
- ...
- }
- public void DisconnectHardware()
- {
- ...
- usbDevHandle = IntPtr.Zero;
- }
- private bool disposedValue = false;
- protected virtual void Dispose(bool disposing)
- {
- if (!disposedValue)
- {
- if (disposing)
- usbDriver = null;
- if (usbDevHandle != IntPtr.Zero)
- {
- UsbClose(usbDevHandle);
- usbDevHandle = IntPtr.Zero;
- }
- disposedValue = true;
- }
- }
- ~UsbMotorDriver()
- {
- Dispose(false);
- }
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
- };
Eigentlich müsste ich so doch im gesamten Programm auf
UsbMotorDriver.Instance
zugreifen können ohne jemals Dispose aufrufen zu müssen. Das wird letztlich durch den Finalizer am Programmende aufgerufen und schließt die Usb-Verbindung. Liege ich da richtig, oder kann es passieren, dass der GC gegen meinen Willen zwischendurch mal UsbMotorDriver.Instance
zerstört und den Speicher frei gibt?Grüße