1

我在 VS 2012 中为 Windows 8 商店应用程序创建了一个类库项目 (dll),但现在引入了 Windows 8.1,有一些新的 API 可用于操作系统(例如,用于唯一标识用户的广告 ID),我想在其中使用我的 dll,但我不想发布针对 Windows 8.1 的单独 dll。我的目标是分发可以在 Windows 8 和 Windows 8.1 商店应用程序中引用的单个 dll。如果我将创建一个针对 8.1 的 dll,那么 8.0 应用程序将无法使用我的 dll。

有没有办法检查运行时可用的特定 Api 或 Windows 8.1 应用程序的任何预处理器,以便我的 dll 在运行时识别操作系统并执行代码,例如

string deviceId=string.Empty;

#if W8.1
deviceId=Windows.System.UserProfile.AdvertisingManager.AdvertisingId;
#endif

或者请建议任何其他方式,以便我只能将一个 dll 分发给我的用户?

4

2 回答 2

2

最后通过反思来做。AdvertisingManager API 在 Windows 8 中不可用,但如果应用程序在 Windows 8.1 上运行,相同的 dll(目标框架是 Windows 8)将通过反射访问 AdvertisingManager。因此,无需为不同版本分发两个 dll。

      Type tp = Type.GetType("Windows.System.UserProfile.AdvertisingManager, Windows.System, Version=255.255.255.255, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime");
        if (tp != null)
        {
            PropertyInfo properties = tp.GetRuntimeProperty("AdvertisingId");
            if (properties != null)
            {
                string deviceId = (string)properties.GetValue(null);
            }
        }

输出

案例 1:在 Windows 8 上运行的 Windows 8 应用程序

在这种情况下,tp 将返回 null,因为 AdvertisingManager API 在 Windows 8 中不可用。

案例 2:在 Windows 8.1 上运行的 Windows 8 应用程序

由于 AdvertisingManager API 在 Windows 8.1 中可用,所有面向 Windows 8 的应用程序都可以访问此 API 并在这种情况下获取 AdvertisingId。

案例 3:在 Windows 8.1 上运行的 Windows 8.1 应用

该 API 可直接在 Windows 8.1 应用程序中使用。所以,不需要走反射路径。

于 2013-10-29T06:04:11.117 回答
0

您可以尝试根据 .NET 框架版本创建自己的条件指令。Windows 8.1 使用 .NET 4.5.1

这个 MSDN 示例可以帮助您 =>构建多个 TargetFramework 版本库

于 2013-10-25T08:43:51.793 回答