1

我正在编写一个为 .NET 4.5、Windows RT 和 Windows Phone 8 设置的可移植类库 (PCL)。

我想在字典中找到最小值。在网上搜索说MoreLinq是最快的方法。

所以我添加了一个参考,它编译得很好。

但我不确定我的 PCL 是否有“破损收容”。

如果我引用了不符合 PCL 约束的内容,编译器会告诉我吗?

4

2 回答 2

4

不幸的是,编译器不会为你做这样的检查。

我尝试使用命名空间中的类创建一个 .NET 4 类库,System.Data这显然与 PCL 不兼容。我从 .NET 4.5、Windows Store 和 Windows Phone 8 的可移植类库项目中引用和使用它没有任何问题。甚至更多:我设法从 Windows Store 应用程序引用了这个可移植库,编译并运行它。当然,运行 Windows 应用程序认证工具包会发现这一点并且验证失败。

提前检测这些问题的最佳选择是通过 NuGet 添加引用,以检查包是否支持您的目标配置文件。当然,这需要以特定的方式准备 NuGet 包。

对于某些第三方库,这样的包可能不可用,但它可能仍与 PCL 兼容。在这种情况下,我建议您下载源代码并尝试自己创建一个具有正确目标的可移植类库。这样,只要它只引用系统程序集,编译器就会警告您有关兼容性问题。

于 2012-12-04T06:14:55.560 回答
2

MoreLinq的特殊情况下,这个库很容易转换为可移植类库。

  1. 创建面向例如 .NET Framework 4 及更高版本、Silverlight 4 及更高版本、Windows Phone 7 及更高版本以及 Windows 应用商店应用程序的可移植类库项目。
  2. 将包含在主MoreLinq库中的所有文件添加到 PCL,除了ToDataTable.csToHashSet.cs
  3. 将以下条件编译符号添加到 PCL 项目:NO_SERIALIZATION_ATTRIBUTES, NO_EXCEPTION_SERIALIZATION, NO_HASHSET, NO_TRACING.
  4. 修改exceptBy.cs中的私有方法ExceptByImpl,而不是在为 PCL 构建时使用:Dictionary<,>HashSet<>

    private static IEnumerable<TSource> ExceptByImpl<TSource, TKey>(
        this IEnumerable<TSource> first,
        IEnumerable<TSource> second,
        Func<TSource, TKey> keySelector,
        IEqualityComparer<TKey> keyComparer)
    {
    #if !NO_HASHSET
    HashSet<TKey> keys = new HashSet<TKey>(second.Select(keySelector), keyComparer);
    foreach (var element in first)
    {
        TKey key = keySelector(element);
        if (keys.Contains(key))
        {
            continue;
        }
        yield return element;
        keys.Add(key);
    }
    #else
    var keys = second.ToDictionary(keySelector, keyComparer);
    foreach (var element in first)
    {
        TKey key = keySelector(element);
        if (keys.ContainsKey(key))
        {
            continue;
        }
        yield return element;
        keys.Add(key, element);
    }
    #endif
    

    }

当然,这不是您问题的直接答案,但希望它对您的具体问题有用。

于 2012-12-04T10:24:45.570 回答