在WinForm项目中使用Windows Runtime的方法
最近需要在Winform项目中使用蓝牙,蓝牙模块是同事负责的,找了好多版本的蓝牙库,对BLE的支持都不好。最后发现系统直接提供了Windows.Devices.Bluetooth
这个库可以用,但是只能在Universal项目中使用。试过在nuget中找到的Target.WindowsRuntime,但是根本不能用。经过一番google,发现可以用hack的方法在Winform中使用,特此记录。
PS: 我用的是vs2015,win10,.net 4.5,据说win8 vs2013也是可以的,我没有测试过。如果使用其他版本的操作系统,或者.net版本,请自行修改对应参数测试。
步骤说明
- 手工修改
csproj
项目文件 - 添加对
Windows.XXXXX
库的引用 - 添加
project.json
配置文件 - 添加对
WindowsRuntime
库的引用
修改项目文件
需要关闭项目工程文件,手工在目标csproj
文件中添加如下代码
1 2 3 |
<propertyGroup> <targetPlatformVersion>10.0</targetPlatformVersion> </propertyGroup> |
你期望编译的目标操作系统是win10,就写10.0
,如果是win8,就写8.0
,以此类推。
上个截图,更容易理解
添加对库的引用
这个时候,启动sln
工程文件,然后右键点击引用
-添加引用...
,会发现,左侧的分类,多了一类Universal Windows
赶紧把需要的库加进来吧,加进来以后,发现代码中可以正常引用了。
但是会编译不过,提示
1 |
Error occurred while restoring NuGet packages: Could not find file 'C:\Users\user\Documents\Visual Studio 2015\Projects\TestWindowsRuntimeTarget\TestWindowsRuntimeTarget\project.json'. |
添加project.json文件
上面的错误,提示我们需要project.json
,在项目中新建这个名称的json文件,然后复制下面的内容
1 2 3 4 5 6 7 8 9 10 |
{ "frameworks": { ".NETFramework,Version=v4.5": { "dependencies": {} } }, "runtimes": { "win": {} } } |
其中的v4.5
可以改成任意你需要的.net版本号。
再编译一次试试,大功告成,这样就可以顺利编译通过了。
添加对WindowsRuntime库的引用
这个时候虽然编译通过了,但是实际使用Windows
相关类库的时候,还是会有问题,需要做最后一步操作来解决这个问题。
继续添加引用,并选择从文件添加,在下面的目录中,找到System.Runtime.WindowsRuntime.dll
,并加入引用。
1 |
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5 |
如果需要用到async/await
,还需要添加对Windows.winmd
的引用,在下面的目录中
1 |
C:\Program Files (x86)\Windows Kits\10\UnionMetadata |
这样,就可以在WinForm项目中使用Universal的类库啦。
你好,我在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中试了各种方法,始终不得解,求教正确姿势??
已经解决了
我用C#制作winform程序,我想得到外围BLE设备(Beacon)的MAC地址,设备名称等信息
请问我应该怎样实现,麻烦提供实现的代码,谢谢!
即:
如何开始扫描?
怎样获取设备信息?
怎么解决的
呼叫JENNAL
现在在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中试了各种方法,始终不得解,求教正确姿势??
已经解决添加对Windows.winmd的引用就可以用BluetoothLEDevice.FromIdAsync(device.Id);
但是发现BluetoothLEDevice.FromIdAsync(device.Id);这样执行了没反应、即不报错、也不返回值。
请问 selectedCharacteristic.ValueChanged += Characteristic_ValueChanged;
private async void Characteristic_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args)
{//这里一直没有触发怎么办的?
var newValue = FormatValueByPresentation(args.CharacteristicValue, presentationFormat);
}
大佬 有群嘛 也在用Windows.Device.Bluetooth
不好意思,没有建群