在可移植类库中使用外部DLL



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

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

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

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

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

很遗憾,编译器不会为您做这样的检查。

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

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

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

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

  1. 创建一个可移植类库项目,以.NET Framework 4及更高版本、Silverlight 4及更高级版本、Windows Phone 7及更高级别以及Windows应用商店应用为目标
  2. MoreLinq主库中包含的所有文件添加到PCL中,ToDataTable.csToHashSet.cs除外
  3. 将以下条件编译符号添加到PCL项目:NO_SERIALIZATION_ATTRIBUTESNO_EXCEPTION_SERIALIZATIONNO_HASHSETNO_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
    

    }

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

最新更新