Использование внешних библиотек DLL в переносимой библиотеке классов

Я создаю переносимую библиотеку классов (PCL), настроенную для .NET 4.5, Windows RT и Windows Phone 8.

Я хочу найти минимальное значение в словаре. Поиск в Интернете показывает, что MoreLinq — это самый быстрый способ сделать это.

Поэтому я добавил ссылку, и она скомпилировалась нормально.

Но я не уверен, что у меня есть "Broken Containment" для моего PCL.

Сообщит ли мне компилятор, если я сошлюсь на что-то, что не соответствует ограничениям PCL?


person Vaccano    schedule 04.12.2012    source источник


Ответы (2)


К сожалению, компилятор не делает такую ​​проверку за вас.

Я попытался создать библиотеку классов .NET 4, используя классы из пространства имен System.Data, которое явно несовместимо с PCL. У меня не было проблем со ссылкой и использованием ее из проекта переносимой библиотеки классов для .NET 4.5, Магазина Windows и Windows Phone 8. Более того: мне удалось сослаться на эту переносимую библиотеку из приложения Магазина Windows, скомпилировать ее и запустить. Конечно, запуск комплекта сертификации приложений для Windows показал это, и проверка не удалась.

Лучше всего заранее обнаруживать эти проблемы, добавляя ссылку через NuGet, которая проверяет, поддерживает ли пакет ваш целевой профиль. Конечно, для этого требуется, чтобы пакет NuGet был подготовлен особым образом.

Для некоторых сторонних библиотек такой пакет может быть недоступен, но он может быть совместим с PCL. В таких случаях я предлагаю вам скачать исходники и попытаться самостоятельно создать переносимую библиотеку классов с нужными целями. Таким образом, компилятор будет предупреждать вас о проблемах совместимости, если он ссылается только на системные сборки.

person Damir Arh    schedule 04.12.2012

В конкретном случае MoreLinq эта библиотека довольно легко преобразуется в переносимую библиотеку классов.

  1. Создайте проект переносимой библиотеки классов, ориентированный, например, на .NET Framework 4 и выше, Silverlight 4 и выше, Windows Phone 7 и выше и приложения Магазина Windows.
  2. Добавьте в PCL все файлы, включенные в основную библиотеку MoreLinq, кроме ToDataTable.cs и ToHashSet.cs.
  3. Добавьте в проект PCL следующие символы условной компиляции: NO_SERIALIZATION_ATTRIBUTES, NO_EXCEPTION_SERIALIZATION, NO_HASHSET, NO_TRACING.
  4. Измените закрытый метод ExceptByImpl в ExceptBy.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
    

    }

Конечно, это не прямой ответ на ваш вопрос, но, тем не менее, надеюсь, он будет полезен для вашей конкретной проблемы.

person Anders Gustafsson    schedule 04.12.2012