在WinForm项目中使用Windows Runtime的方法

在WinForm项目中使用Windows Runtime的方法

最近需要在Winform项目中使用蓝牙,蓝牙模块是同事负责的,找了好多版本的蓝牙库,对BLE的支持都不好。最后发现系统直接提供了Windows.Devices.Bluetooth这个库可以用,但是只能在Universal项目中使用。试过在nuget中找到的Target.WindowsRuntime,但是根本不能用。经过一番google,发现可以用hack的方法在Winform中使用,特此记录。

PS: 我用的是vs2015,win10,.net 4.5,据说win8 vs2013也是可以的,我没有测试过。如果使用其他版本的操作系统,或者.net版本,请自行修改对应参数测试。

步骤说明

  1. 手工修改csproj项目文件
  2. 添加对Windows.XXXXX库的引用
  3. 添加project.json配置文件
  4. 添加对WindowsRuntime库的引用

修改项目文件

需要关闭项目工程文件,手工在目标csproj文件中添加如下代码

你期望编译的目标操作系统是win10,就写10.0,如果是win8,就写8.0,以此类推。

上个截图,更容易理解

添加对库的引用

这个时候,启动sln工程文件,然后右键点击引用-添加引用...,会发现,左侧的分类,多了一类Universal Windows

赶紧把需要的库加进来吧,加进来以后,发现代码中可以正常引用了。

但是会编译不过,提示

添加project.json文件

上面的错误,提示我们需要project.json,在项目中新建这个名称的json文件,然后复制下面的内容

其中的v4.5可以改成任意你需要的.net版本号。

再编译一次试试,大功告成,这样就可以顺利编译通过了。

添加对WindowsRuntime库的引用

这个时候虽然编译通过了,但是实际使用Windows相关类库的时候,还是会有问题,需要做最后一步操作来解决这个问题。

继续添加引用,并选择从文件添加,在下面的目录中,找到System.Runtime.WindowsRuntime.dll,并加入引用。

如果需要用到async/await,还需要添加对Windows.winmd的引用,在下面的目录中

这样,就可以在WinForm项目中使用Universal的类库啦。

参考资料

10 comments

  1. 你好,我在Google之后也成功的添加了Windows RunTime,现在在WinForm中可以搜索到BLE蓝牙,但是BluetoothLEDevice.FromIdAsync(device.Id); 要获取具体的蓝牙设备对象的时候,报错了,有什么好的解决方法。在微软的官网Sample中,是一个UWP的Demo,这一句注释,BluetoothLEDevice.FromIdAsync must be called from a UI thread because it may prompt for consent。我在Winform中试了各种方法,始终不得解,求教正确姿势??

      1. 我用C#制作winform程序,我想得到外围BLE设备(Beacon)的MAC地址,设备名称等信息
        请问我应该怎样实现,麻烦提供实现的代码,谢谢!
        即:
        如何开始扫描?
        怎样获取设备信息?

  2. 现在在WinForm中可以搜索到BLE蓝牙,但是BluetoothLEDevice.FromIdAsync(device.Id); 要获取具体的蓝牙设备对象的时候,报错了,有什么好的解决方法。在微软的官网Sample中,是一个UWP的Demo,这一句注释,BluetoothLEDevice.FromIdAsync must be called from a UI thread because it may prompt for consent。我在Winform中试了各种方法,始终不得解,求教正确姿势??

  3. 已经解决添加对Windows.winmd的引用就可以用BluetoothLEDevice.FromIdAsync(device.Id);
    但是发现BluetoothLEDevice.FromIdAsync(device.Id);这样执行了没反应、即不报错、也不返回值。

  4. 请问 selectedCharacteristic.ValueChanged += Characteristic_ValueChanged;
    private async void Characteristic_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args)
    {//这里一直没有触发怎么办的?
    var newValue = FormatValueByPresentation(args.CharacteristicValue, presentationFormat);
    }

Leave a Reply to 1 Cancel reply

Your email address will not be published. Required fields are marked *