是否可以从非通用应用程序使用Wi-Fi Direct?
我一直在尝试编写一个简单的基于命令行的应用程序 (使用Visual Studio 2015和Windows 10中的C#和.NET)来启动Microsoft的Universal Samples之后的Wi-Fi Direct广告商,但手动添加对必要*的引用。 dll和* .winmd程序集,而不是创建UniversalWindowsPlatform项目。 (来自Reffere Assemblies的System.Runtime.WindowsRuntime和来自Windows Kits \ 10 \ Union Metadata \ Windows.winmd的Windows)
这是相关代码:
public void StartAdvertisement(WiFiDirectAdvertisementListenStateDiscoverability discoverability, bool listenToConnections) { if (mPublisher == null) mPublisher = new WiFiDirectAdvertisementPublisher(); if (listenToConnections) { mListener = new WiFiDirectConnectionListener(); mListener.ConnectionRequested += OnConnectionRequested; } mPublisher.StatusChanged += OnStatusChanged; mPublisher.Advertisement.IsAutonomousGroupOwnerEnabled = true; mPublisher.Advertisement.ListenStateDiscoverability = discoverability; mPublisher.Start(); } async void OnConnectionRequested(WiFiDirectConnectionListener sender, WiFiDirectConnectionRequestedEventArgs connectionEventArgs) { // Connection code }
广告客户启动正常(可以从其他设备找到它,并创建必要的网络接口),但是当其他设备尝试连接时,不会调用OnConnectionRequested方法。 我已经看到,对于使用Wi-Fi Direct,通用Windows应用程序必须在其清单中添加邻近function ,但对于通用应用程序,没有明显。
我是否可以仅通过引用必要的程序集从非通用Windows应用程序使用Windows 10 WiFi Direct API?
因此,我最终可以使用WinRT API(包括Wi-Fi Direct,即使没有明确声明接近function使用)来自非通用Windows应用程序,但在Windows 10中比8或8.1有点棘手。
编辑项目的* .csproj后,在组内添加以下行…
10.0.10240.0
您将在Reference Manager中看到一个名为Windows的新部分,其中包含winmd库。 它们都不会有用,你可能需要的只是两个你必须添加浏览的库:
C:\Program Files (x86)\Windows Kits\10\Union Metadata\Windows.winmd C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll
有了这两个参考,你就可以避免像这样的问题
‘XXXX类型在未引用的程序集中定义’
要么
‘命名空间XXXX在两个不同的程序集中定义’。
但我们还没有完成! 特别是在Wi-Fi Direct中,一旦广告客户,广告和其他一些计算机尝试连接,如果您有WiFiDirectConnectionListener的实例,则应调用以下方法
async void OnConnectionRequested(WiFiDirectConnectionListener sender, WiFiDirectConnectionRequestedEventArgs connectionEventArgs)
但相反,你得到一个System.BadImageFormatException 。 这是因为System.Runtime.WindowsRuntime.dll实际版本与其清单中声明的版本有所不同,因此无法加载。
在Visual Studio中打开属性工具,选择System.Runtime.WindowsRuntime引用并更改以下属性:将Local复制为false,将Specific Version复制为true。
现在它应该工作!
- 从.NET服务作为其他用户启动.NET应用程序时的权限问题?
- 在Using语句中从DataLayer返回DataReader
- .NET服务是否表现出线程敏捷性?
- 将System.Windows.Media.Imaging.BitmapSource转换为System.Drawing.Image
- 使用C#.NET 3.5 WinForms进行部分透明化?
- 检查Silverlight中的互联网连接
- 事件参数; “发件人为对象”,或“发件人为T”?
- 使用OpenXml创建分页符
- 使用提升的权限进行调试时,Marshal.GetActiveObject(“Outlook.Application”)会抛出MK_E_UNAVAILABLE