Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在UWP中使用System.XXX.dll编写版本自适应代码_Uwp - Fatal编程技术网

在UWP中使用System.XXX.dll编写版本自适应代码

在UWP中使用System.XXX.dll编写版本自适应代码,uwp,Uwp,我正在开发一个UWP应用程序,最小版本为15063(创作者更新),目标版本为16299(秋季创作者更新)。在应用程序的某个地方,我想列举机器的网络适配器。此功能只需在桌面环境(相对较新的Windows 10版本)中使用。但我也希望支持手机中的其他功能(卡在创建者更新中) 问题来了。我用来枚举网络适配器的API来自System.Net.NetworkInformation.dll。如果我为min和target版本选择了Fall Creators Update,则执行此代码时不会出现问题: Syst

我正在开发一个UWP应用程序,最小版本为15063(创作者更新),目标版本为16299(秋季创作者更新)。在应用程序的某个地方,我想列举机器的网络适配器。此功能只需在桌面环境(相对较新的Windows 10版本)中使用。但我也希望支持手机中的其他功能(卡在创建者更新中)

问题来了。我用来枚举网络适配器的API来自System.Net.NetworkInformation.dll。如果我为min和target版本选择了Fall Creators Update,则执行此代码时不会出现问题:

System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
在这种情况下,如果我转到VS中的代码定义,我会看到从以下位置引用程序集的版本=4.2.1.0:

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

但是,当我将min版本降级为Creators Update时,上述代码失败,出现以下异常:

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

这一次,从以下位置加载程序集的版本=4.1.0.0:

C:\Program Files(x86)\Microsoft SDK\UWPNuGetPackages\system.net.networkinformation\4.1.0\ref\netcore50\system.net.networkinformation.dll

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

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

但是,我仍然有可能实现我在一开始提到的目标。因为我只需要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>

因此,如果桌面上的操作系统早于秋季创建者更新(能够运行我的网络适配器枚举代码),则我的应用程序将不会运行。如果我可以将更新的dll复制到我的应用程序包中,并以某种方式使我的应用程序接受它(就像我将min version升级到16299时所做的那样),我的问题就会得到解决。由于我的应用程序包中有100多个System.XXX.dll,所以在不同的操作系统版本中运行时,应该有一种使用不同版本的System.XXX.dll的方法


注意:还有一个来自Microsoft()的NuGet库。引用它对我也没有帮助。

本例中的问题源于这样一个事实,即该方法实际上仅在UWP Fall Creators Update时实现,UWP Fall Creators Update是支持.NET标准2.0的第一个版本,并且实际上实现了许多以前不可用的.NET API。以前,此方法是可用的,尽管只是没有实现,请参阅

你的第一个选择是增加Creators更新的min target to Fall,这将阻止你的应用程序在Windows 10 Mobile上运行

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

Windows.Networking.Connectivity.NetworkInformation.GetConnectionProfiles()
这个API也应该为您提供所需的信息


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

Windows.Networking.Connectivity.NetworkInformation.GetConnectionProfiles(),不幸的是,与System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()相比,它非常有限。另一方面,您提到的线程清楚地表明,Creators Update似乎支持后一种API,但实际上并未实现。他们需要在文件中更好地解释这一决定。根据这些信息,我更清楚我的选择。谢谢你对这个帖子的引用。