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

时间:2015-09-07 13:14:47

标签: c# .net windows-10 wifi-direct win-universal-app

我一直在尝试编写一个简单的基于命令行的应用程序(使用Visual Studio 2015和Windows 10中的C#和.NET)来启动一个Wi-Fi Direct广告商{{3但是,手动添加对必要的* .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应用程序必须在其清单中添加Microsoft's Universal Samples,但对于通用应用程序,没有清单。

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

1 个答案:

答案 0 :(得分:2)

因此,我终于可以使用WinRT API(包括Wi-Fi Direct,即使没有明确声明接近功能使用)来自非通用Windows应用程序,但在Windows 10中比8更有点棘手。或8.1。

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

<TargetPlatformVersion>10.0.10240.0</TargetPlatformVersion>

您将在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

通过这两个引用,您可以避免像

这样的问题
  

&#39;类型XXXX在未引用的程序集中定义&#39;

  

&#39;名称空间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。

现在应该可以了!