首页 文章

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

提问于
浏览
0

我正在使用Min Version 15063(Creators Update)和目标版本16299(Fall Creators Update)开发UWP应用程序 . 在应用程序的某个地方,我想枚举机器的网络适配器 . 此功能只需在桌面环境(具有相对较新的Windows 10版本)中工作 . 但我也支持移动设备中的其他功能(卡在创作者更新中) .

这就是问题所在 . 我用于枚举网络适配器的API是System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces(),它来自System.Net.NetworkInformation.dll . 如果我为min和target版本选择 Fall Creators Update ,则此代码执行时没有问题:

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

但是,当我将min版本降级为 Creators Update 时,上面的代码失败并出现此异常:

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

这次,从这个位置加载版本= 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),可以通过这个帮助器类进行检查 . 但它没有我需要的功能 . 因此,我假设当微软谈论"version adaptive code"时,它意味着那些没有被复制到应用程序包中的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复制到我的应用程序包并以某种方式让我的应用程序接受它(就像我将min版本升级到16299时那样),我的问题将得到解决 . 由于我的应用程序包中有超过一百个System.XXX.dll,因此在不同的操作系统版本中运行时,应该有一种方法可以使用它们的不同版本 .

注意:还有一个来自Microsoft的NuGet库(System.Net.NetworkInformation) . 引用它也没有帮助我 .

1 回答

  • 1

    在这种情况下的问题源于这样的事实,即该方法实际上仅在UWP Fall Creators Update中实现,这是第一个支持.NET Standard 2.0并实际实现许多以前不可用的.NET API的版本 . 以前这种方法虽然只是没有实现,但是可以使用,参见this thread .

    您拥有的第一个选项是将最小目标增加到Fall Creators Update,但这会阻止您的应用在Windows 10 Mobile上运行 .

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

    Windows.Networking.Connectivity.NetworkInformation.GetConnectionProfiles()
    

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

    然后,您可以使用 ApiInformation 来调用正确的API,具体取决于您运行的平台 .

相关问题