是否可以从非通用应用程序使用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。

现在它应该工作!