在UWP

时间:2018-07-14 10:58:35

标签: uwp

我正在开发具有最低版本15063(创建者更新)和目标版本16299(秋季创建者更新)的UWP应用。在应用程序的某个位置,我想枚举机器的网络适配器。此功能仅需要在桌面环境(具有相对较新的Windows 10版本)中工作。但是我也将支持移动中的其他功能(卡在“创作者更新”中)。

问题来了。我用来枚举网络适配器的API是 System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces() ,它来自 System.Net.NetworkInformation.dll 。如果我同时选择了最低版本和目标版本的秋季创作者更新,则此代码可以正常执行:

System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()

在这种情况下,如果我转到VS中的代码定义,则会发现从此位置引用了程序集的 Version = 4.2.1.0

  

C:\ Program Files(x86)\ Microsoft SDKs \ UWPNuGetPackages \ microsoft.netcore.universalwindowsplatform \ 6.1.5 \ ref \ uap10.0.15138 \ System.Net.NetworkInformation.dll

但是,当我将最低版本降级为 Creators Update 时,以上代码因以下异常而失败:

  

System.NotImplementedException:方法或操作未实现。

这次,从该位置加载程序集的 Version = 4.1.0.0

  

C:\ Program Files(x86)\ Microsoft SDKs \ UWPNuGetPackages \ system.net.networkinformation \ 4.1.0 \ ref \ netcore50 \ System.Net.NetworkInformation.dll

我看到这个版本的库没有实现我使用的方法。但是问题是, System.Net.NetworkInformation.dll 被复制到我的应用程序的程序包中(与其他System.XXX.dlls一样)。即使我的桌面操作系统能够运行该库的较新版本,我的应用程序也只能加载和执行复制到其程序包中的一个。

除此之外,可以帮助我们编写版本和平台特定代码的ApiInformation类甚至无法识别此方法或类型。有一个非常轻量级的WinRT替代方法(Windows.Networking.Connectivity),可以通过此帮助程序类进行检查。但是它没有我需要的功能。因此,我假设当微软谈论“版本自适应代码”时,这意味着那些不会复制到应用程序包中的WinRT API(我猜它们是从OS加载的)。

但是,我仍然有可能实现我在开始时提到的目标。因为我只需要一个 System.Net.NetworkInformation.dll 版本。我在清单文件中添加了依赖项声明:

<Dependencies>
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.16299.0" MaxVersionTested="10.0.16299.0"/>
    <TargetDeviceFamily Name="Windows.Mobile" MinVersion="10.0.15063.0" MaxVersionTested="10.0.16299.0"/>
</Dependencies>

因此,我的应用程序将无法在操作系统低于 Fall Creators Update (可以运行我的网络适配器枚举代码)的操作系统的桌面上运行。如果我可以将较新的dll复制到我的应用程序包中并以某种方式使我的应用程序接受它(就像将最小版本升级到16299时一样),那么我的问题将得到解决。由于我的应用程序包中有一百多个System.XXX.dll,因此当在不同的OS版本中运行时,应该有一种使用它们的不同版本的方法。

注意:还有Microsoft(System.Net.NetworkInformation)提供的NuGet库。引用它也无济于事。

1 个答案:

答案 0 :(得分:1)

这种情况下的问题源于以下事实:该方法实际上仅在UWP Fall Creators Update时才实施,这是第一个支持.NET Standard 2.0的版本,并且实际上实现了许多以前不可用的.NET API。以前,此方法仅在未实施的情况下可用,请参见this thread

您的第一个选择是将最低目标提高到Fall Creators Update,但这将阻止您的应用在Windows 10移动版上运行。

更好的解决方案是使用UWP API,例如:

Windows.Networking.Connectivity.NetworkInformation.GetConnectionProfiles()

此API还应为您提供所需的信息。

然后可以根据运行的平台使用ApiInformation调用正确的API。