是否可以从非通用应用程序使用 Wi-Fi Direct?

Posted

技术标签:

【中文标题】是否可以从非通用应用程序使用 Wi-Fi Direct?【英文标题】:Is it possible to use Wi-Fi Direct from a non Universal application? 【发布时间】:2015-09-07 13:14:47 【问题描述】:

我一直在尝试编写一个简单的基于命令行的应用程序(使用 Visual Studio 2015 和 Windows 10 中的 C# 和 .NET)以在 Microsoft's Universal Samples 之后启动 Wi-Fi Direct 广告商,但手动添加对必要的 *.dll 和 *.winmd 程序集的引用,而不是创建 UniversalWindowsPlatform 项目。 (System.Runtime.WindowsRuntime 来自 Refference Assemblies 和 Windows 来自 Windows Kits\10\Union Metadata\Windows.winmd)

这是相关代码:

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 应用程序必须将 proximity capability 添加到其清单中,但对于 通用 应用程序,没有清单。

我能否仅通过引用必要的程序集从非通用 Windows 应用程序中使用 Windows 10 WiFi Direct API?

【问题讨论】:

【参考方案1】:

所以,我终于可以从非通用 Windows 应用程序中使用 WinRT API(包括 Wi-Fi Direct 的 API,即使没有声明使用邻近功能的清单),但在 Windows 10 中比在 8 中有点棘手或 8.1。

编辑项目的 *.csproj 以在组内添加以下行...

<TargetPlatformVersion>10.0.10240.0</TargetPlatformVersion>

您将在引用管理器中看到一个名为 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 引用并更改以下属性:将本地复制为 false,将特定版本复制为 true。

现在应该可以了!

【讨论】:

以上是关于是否可以从非通用应用程序使用 Wi-Fi Direct?的主要内容,如果未能解决你的问题,请参考以下文章

涂鸦通用Wi-Fi SDK相关API使用

从非 Java 应用程序中获取文本

是否可以在 Spring 中从非事务方法调用事务方法?

是否可以从非 REST 部分形式组合 REST 和非 REST 操作和资源?

Wi-Fi 直连技术

有没有办法使用 iPhone 从非 Apple 蓝牙设备读取数据?