1

我编码了便携式类库(PCL),即设置为.NET 4.5中,Windows RT和Windows Phone 8在便携式类库

我想找到一个最小值使用外部的DLL字典。在网上搜索说MoreLinq是最快的方法。

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

但我不确定我的PCL是否有“破碎遏制”。

编译器会告诉我是否引用了不适合PCL约束的东西吗?

回答

4

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

我尝试使用System.Data命名空间中的类创建一个.NET 4类库,它显然不兼容PCL。我从用于.NET 4.5,Windows Store和Windows Phone 8的可移植类库项目中引用和使用它没有任何问题。甚至更多:我设法从Windows应用商店应用程序中引用此可移植库,编译并运行它。当然,运行Windows应用程序认证套件显示,验证失败。

提前检测这些问题的最佳方法是通过NuGet添加参考,它会检查包是否支持您的目标配置文件。当然这需要NuGet包以特殊方式进行准备。

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

2

MoreLinq的特殊情况下,该库很容易转换为便携式类库。

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

    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 
    

    }

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