Сборки PCL и чтение файлов ресурсов

Я читаю файлы в .Net, предназначенные для мобильных платформ, поэтому я использую PCL. Я заметил, что если я добавляю/изменяю свои целевые платформы, варианты сборки сильно различаются. В общем, как лучше всего получить максимальное количество сборок в PCL?

Вот что-то более конкретное: я хотел бы использовать System.Reflection.Assembly.GetExecutingAssembly(); И System.IO.Path Пока мне удалось получить только одно или другое. Кто-нибудь нашел способ получить оба?

Вот класс, который я хочу реализовать:

public class ContentProviderImplementation : IContentProvider
    {
        private static Assembly _CurrentAssembly;
        private Assembly CurrentAssembly
        {
            get
            {
                if (_CurrentAssembly == null)
                {
                    _CurrentAssembly = Assembly.GetExecutingAssembly();
                }
                return _CurrentAssembly;
            }
        }
        public StreamReader LoadContent(string relativePath)
        {
            string localXMLUrl = Path.Combine(Path.GetDirectoryName(CurrentAssembly.GetName().CodeBase), relativePath);
            return new StreamReader(File.OpenRead(new Uri(localXMLUrl).LocalPath));
        }
    }
Каков наилучший концептуальный способ (со спецификой кода все в порядке, но мне не нужны прямые решения, если только он не получает область действия для правильных сборок PCL) для реализации этого для нескольких мобильных платформ? В частности: IOS, Android, Windows 8.1 и Windows Phone.

Это ответ на наиболее связанный вопрос SO:

Переносимые библиотеки классов позволяют работать с пространствами имен и классами, существующими на всех платформах, на которые вы ориентируетесь. .Net 4.5 (при условии, что вы имеете в виду полный рабочий стол WinForms/WPF), Windows 8 и Windows Phone 8 очень по-разному обращаются к файлам и имеют разные файлы, доступные для них. Доступ к файлам также сильно различается: встроенный контент; встроенные ресурсы; изолированное хранение; общие папки; полная файловая система. Не все они доступны на всех упомянутых вами платформах.

Краткий ответ. Вы, вероятно, не можете делать то, что вам нужно. Доступ к файловой системе сильно различается на разных платформах и обычно должен выполняться по-разному для каждой платформы. Что вы можете сделать, так это определить интерфейс для доступа к файлам (открыть, прочитать, сохранить и т. д.), который может использовать ваш PCL, а затем создать специфичные для платформы экземпляры, которые вы передаете в PCL по мере необходимости.

URL-адрес связанного вопроса SO: C# PCL Reading from File

Кроме того, мне нравится иметь в виду то, что я говорю. Пожалуйста, скажите мне, если я неправильно использую какую-либо терминологию программирования. Я довольно новичок на сцене программного обеспечения! Спасибо, парни!


person gordlonious    schedule 18.01.2014    source источник


Ответы (1)


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

Дело не в количестве сборок, а в API, которые вы сможете использовать.

Как правило, чем на меньшее количество платформ ориентирован ваш PCL, тем больше API вы сможете использовать. Кроме того, чем новее версии всех выбранных вами платформ, тем больше API вы получите.

Для полностью повторно используемых библиотек, таких как JSON.NET, вы, вероятно, захотите использовать как можно больше платформ. Однако использование PCL в приложениях обычно более ограничено потребностями вашего приложения. Для получения наилучших результатов настройте таргетинг на столько платформ, сколько вам нужно сегодня, и включите те, которые, как вы знаете, понадобятся вам завтра, но не просто ставьте галочки во всех полях — вы просто ограничите себя.

Я хотел бы использовать Assembly.GetExecutingAssembly()

Этот API устарел (как и Assembly.GetCallingAssembly). Дело не в том, что вы многое упускаете. В методах экземпляра вы можете просто использовать GetType().GetTypeInfo().Assembly. В статических методах вы можете заменить его на typeof(TheTypeYourMethodIsIn).GetTypeInfo().Assembly.

Обратите внимание, что GetTypeInfo() — это новый метод, добавленный в .NET 4.5. На старых платформах вы просто опускаете вызов GetTypeInfo(). Дополнительные сведения см. в записи нашего блога на тему Развитие API Reflection. .

person Immo Landwerth    schedule 18.01.2014
comment
Я использую PCL .Net 4.5 Profile 111 и в методе экземпляра не могу найти GetTypeInfo(). Я что-то упустил? - person Amjad Husseini; 03.12.2017