是否可以从非通用应用程序使用 Wi-Fi Direct?
Is it possible to use Wi-Fi Direct from a non Universal application?
我一直在尝试编写一个简单的基于命令行的应用程序(使用来自 Visual Studio 2015 和 Windows 10 的 C# 和 .NET)在 Microsoft's Universal Samples 之后启动 Wi-Fi Direct 广告程序,但手动添加对必要的 *.dll 和 *.winmd 程序集的引用,而不是创建通用 Windows 平台项目。 (System.Runtime.WindowsRuntime 来自参考程序集和 Windows 来自 Windows Kits\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,但对于 generic 应用程序,有没有清单。
我能否仅通过引用必要的程序集从非通用 Windows 应用程序中使用 Windows 10 WiFi Direct API?
因此,我终于可以在非通用 Windows 应用程序中使用 WinRT API(包括 Wi-Fi Direct API,即使没有声明邻近功能使用的清单),但在 Windows 10 比 8 或 8.1 中的要复杂一些。
编辑项目的 *.csproj 以在组内添加以下行后...
<TargetPlatformVersion>10.0.10240.0</TargetPlatformVersion>
您会在引用管理器中看到一个名为 Windows 的新部分,其中包含 winmd 库。 None 其中会有用,您可能需要的只是在两个库中,您必须添加浏览:
C:\Program Files (x86)\Windows Kits\Union Metadata\Windows.winmd
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll
通过这两个引用,您将避免
等问题
'The type XXXX is defined in an assembly that is not referenced'
或
'The namespace XXXX is defined in two different assemblies'.
但我们还没有完成!特别是在 Wi-Fi Direct 中,一旦广告商,你知道,广告,并且一些其他计算机尝试连接,如果你有 WiFiDirectConnectionListener 的实例,应该调用以下方法
async void OnConnectionRequested(WiFiDirectConnectionListener sender, WiFiDirectConnectionRequestedEventArgs connectionEventArgs)
但您得到的是 System.BadImageFormatException。那是因为 System.Runtime.WindowsRuntime.dll 实际版本与其清单中声明的版本存在某种差异,因此无法加载。
打开 Visual Studio 中的属性工具,select System.Runtime.WindowsRuntime 引用并更改以下属性:将本地复制为 false,将特定版本复制为 true。
现在应该可以了!
我一直在尝试编写一个简单的基于命令行的应用程序(使用来自 Visual Studio 2015 和 Windows 10 的 C# 和 .NET)在 Microsoft's Universal Samples 之后启动 Wi-Fi Direct 广告程序,但手动添加对必要的 *.dll 和 *.winmd 程序集的引用,而不是创建通用 Windows 平台项目。 (System.Runtime.WindowsRuntime 来自参考程序集和 Windows 来自 Windows Kits\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,但对于 generic 应用程序,有没有清单。
我能否仅通过引用必要的程序集从非通用 Windows 应用程序中使用 Windows 10 WiFi Direct API?
因此,我终于可以在非通用 Windows 应用程序中使用 WinRT API(包括 Wi-Fi Direct API,即使没有声明邻近功能使用的清单),但在 Windows 10 比 8 或 8.1 中的要复杂一些。
编辑项目的 *.csproj 以在组内添加以下行后...
<TargetPlatformVersion>10.0.10240.0</TargetPlatformVersion>
您会在引用管理器中看到一个名为 Windows 的新部分,其中包含 winmd 库。 None 其中会有用,您可能需要的只是在两个库中,您必须添加浏览:
C:\Program Files (x86)\Windows Kits\Union Metadata\Windows.winmd
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll
通过这两个引用,您将避免
等问题'The type XXXX is defined in an assembly that is not referenced'
或
'The namespace XXXX is defined in two different assemblies'.
但我们还没有完成!特别是在 Wi-Fi Direct 中,一旦广告商,你知道,广告,并且一些其他计算机尝试连接,如果你有 WiFiDirectConnectionListener 的实例,应该调用以下方法
async void OnConnectionRequested(WiFiDirectConnectionListener sender, WiFiDirectConnectionRequestedEventArgs connectionEventArgs)
但您得到的是 System.BadImageFormatException。那是因为 System.Runtime.WindowsRuntime.dll 实际版本与其清单中声明的版本存在某种差异,因此无法加载。
打开 Visual Studio 中的属性工具,select System.Runtime.WindowsRuntime 引用并更改以下属性:将本地复制为 false,将特定版本复制为 true。
现在应该可以了!