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 
    

    }

當然,這不是一個直接的答案你的問題,但希望它是有用的,但你的具體問題。