Home > database >  BluetoothLEDevice.FromIdAsync Returns Uncastable __ComObject
BluetoothLEDevice.FromIdAsync Returns Uncastable __ComObject

Time:12-10

Before we even start: In researching this problem I've looked at dozens of posts here and elsewhere, and realize that VB is the worst for Bluetooth programming. However, this is for a client who has a massive legacy VB system and I have no choice.

According to MS documentation, the BluetoothLEDevice.FromIdAsync is supposed to return a BluetoothLEDevice object but on my system it returns a generic System.__ComObject that I can't cast to a BluetoothLEDevice. I have tried Cast and DirectCast but neither work. The sample C code I've looked at doesn't require any type of casting; the variable is declared and set using the BluetoothLEDevice.FromIdAsync function without any dramas.

Here is my test code.

Private Sub ConnectToDevice(di As DeviceInformation)
    '
    ' di.id = "BluetoothLE#BluetoothLE48:5f:99:3c:fd:36-84:2e:14:26:9e:7b"
    '
    Debug.Print("Connecting To " & di.Name & " at " & Now.ToShortTimeString)
    Dim genericObject As Object
    Dim myDevice As BluetoothLEDevice
    Try
        genericObject = BluetoothLEDevice.FromIdAsync(di.Id)
    Catch ex As Exception
        Debug.Print(ex.Message)
    End Try
    If Not IsNothing(genericObject) Then Debug.Print("Using 'Object' yeilds " & genericObject.ToString)
    Try
        myDevice = BluetoothLEDevice.FromIdAsync(di.Id)
    Catch ex As Exception
        Debug.Print(ex.Message)
    End Try
End Sub

And here is the output:

Connecting To TM-2021090161 at 2:08 PM
Using 'Object' yeilds System.__ComObject
Exception thrown: 'System.InvalidCastException' in testBTLE.exe
Unable to cast object of type 'System.__ComObject' to type 'Windows.Devices.Bluetooth.BluetoothLEDevice'.

And a screen shot of the returned genericObject: Watch Window - Generic ComObject

CodePudding user response:

The FromIdAsync needs to be run async which I couldn't do because I got an error stating it didn't have an awaiter. It turns out that I needed to NuGet the System.Runtime.Windowsruntime dll. I added the Await and it's working now.

Thanks to Andrew for pointing me in the right direction.

  • Related