【问题标题】:Using External DLLs in a Portable Class Library在可移植类库中使用外部 DLL
【发布时间】:2012-12-04 05:05:18
【问题描述】:
我正在编写一个为 .NET 4.5、Windows RT 和 Windows Phone 8 设置的可移植类库 (PCL)。
我想在字典中找到最小值。在网上搜索说MoreLinq 是最快的方法。
所以我添加了一个参考,它编译得很好。
但我不确定我的 PCL 是否有“破损收容”。
如果我引用了不符合 PCL 约束的内容,编译器会告诉我吗?
【问题讨论】:
标签:
c#
.net
windows-runtime
windows-phone-8
portable-class-library
【解决方案1】:
很遗憾,编译器没有为你做这样的检查。
我尝试使用 System.Data 命名空间中的类创建一个 .NET 4 类库,这显然与 PCL 不兼容。我从 .NET 4.5、Windows Store 和 Windows Phone 8 的可移植类库项目中引用和使用它没有问题。甚至更多:我设法从 Windows Store 应用程序引用了这个可移植库,编译并运行它。当然,运行 Windows 应用认证工具包会发现这一点并且验证失败。
提前检测这些问题的最佳选择是通过 NuGet 添加引用,以检查包是否支持您的目标配置文件。当然,这需要以特定的方式准备 NuGet 包。
对于某些第三方库,这样的包可能不可用,但它可能仍与 PCL 兼容。在这种情况下,我建议您下载源代码并尝试自己创建一个具有正确目标的可移植类库。这样,只要它只引用系统程序集,编译器就会警告您有关兼容性问题。
【解决方案2】:
在 MoreLinq 的特殊情况下,这个库很容易转换为可移植类库。
- 创建一个可移植类库项目,目标是 .NET Framework 4 及更高版本、Silverlight 4 及更高版本、Windows Phone 7 及更高版本以及 Windows 应用商店应用。
- 将 MoreLinq 主库中包含的所有文件添加到 PCL,ToDataTable.cs 和 ToHashSet.cs 除外。李>
- 将以下条件编译符号添加到 PCL 项目中:
NO_SERIALIZATION_ATTRIBUTES、NO_EXCEPTION_SERIALIZATION、NO_HASHSET、NO_TRACING。
-
在为 PCL 构建时,修改 ExceptBy.cs 中的私有方法 ExceptByImpl 以使用 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
}
当然,这不是对您问题的直接回答,但希望它对您的具体问题有所帮助。