Как динамически обнаруживать все файлы XAML во всех модулях в приложении Silverlight Prism

Есть ли простой способ динамически обнаружить все файлы XAML во всех загруженных в данный момент модулях (в частности, в приложении Silverlight Prism)? Я уверен, что это возможно, но не уверен, с чего начать.

Это должно происходить в клиенте Silverlight: мы, конечно, могли бы анализировать проекты на машине разработчика, но это снизило бы гибкость и включило бы неиспользуемые файлы в поиск.

В основном мы хотим иметь возможность анализировать все файлы XAML в очень большом проекте Prism (независимо от их загрузки), чтобы идентифицировать все строки локализации. Это позволит нам создать исходную базу данных локализации, которая включает все наши строки привязки ресурсов, а также создать поиск, в каких файлах XAML они встречаются (чтобы облегчить редактирование переводчикам).

Зачем это нужно ?: Худшее для переводчиков - изменить строку в одном контексте только для того, чтобы обнаружить, что она использовалась где-то в другом месте с немного другим значением. Мы разрешаем контекстное редактирование переводов из самого приложения.

Обновление (14 сентября):

Стандартный метод итерации сборок недоступен для Silverlight из-за ограничений безопасности. Это означает, что единственное улучшение решения, приведенного ниже, - это сотрудничество с модулем управления Prism, если это возможно. Если кто-то хочет предоставить решение кода для этой последней части этой проблемы, есть моменты, которыми можно поделиться с вами!

Продолжение:

Итерация содержимого файлов XAP в модульном проекте кажется действительно удобным вещь, которую можно сделать по разным причинам, поэтому добавьте еще 100 представителей, чтобы получить реальный ответ (желательно рабочий пример кода). Ура и удачи!

Ниже приведено частичное решение (работает, но не оптимально):

Ниже приведен код, который я придумал, который представляет собой комбинацию методов из по этой ссылке на встроенных ресурсах (как было предложено Otaku) и моя собственная итерация каталога модулей Prism.

  • Проблема 1 - все модули Если кто-то хочет предоставить решение кода для этой последней части этой проблемы, есть моменты, которыми можно поделиться с вами!

    Продолжение:

    Итерация содержимого файлов XAP в модульном проекте кажется действительно удобным вещь, которую можно сделать по разным причинам, поэтому добавьте еще 100 представителей, чтобы получить реальный ответ (желательно рабочий пример кода). Ура и удачи!

    Ниже приведено частичное решение (работает, но не оптимально):

    Ниже приведен код, который я придумал, который представляет собой комбинацию методов из по этой ссылке на встроенных ресурсах (как было предложено Otaku) и моя собственная итерация каталога модулей Prism.

    • Проблема 1 - все модули Если кто-то хочет предоставить решение кода для этой последней части этой проблемы, есть моменты, которыми можно поделиться с вами!

      Продолжение:

      Итерация содержимого файлов XAP в модульном проекте кажется действительно удобным вещь, которую можно сделать по разным причинам, поэтому добавьте еще 100 представителей, чтобы получить реальный ответ (желательно рабочий пример кода). Ура и удачи!

      Ниже приведено частичное решение (работает, но не оптимально):

      Ниже приведен код, который я придумал, который представляет собой комбинацию методов из по этой ссылке на встроенных ресурсах (как было предложено Otaku) и моя собственная итерация каталога модулей Prism.

      • Проблема 1 - все модули

        Итерация содержимого XAP-файлов в модульном проекте кажется действительно удобной вещью, которую можно сделать по разным причинам, поэтому нужно добавить еще 100 повторений, чтобы получить реальный ответ (предпочтительно рабочий пример кода). Ура и удачи!

        Ниже приведено частичное решение (работает, но не оптимально):

        Ниже приведен код, который я придумал, который представляет собой комбинацию методов из по этой ссылке на встроенных ресурсах (как было предложено Otaku) и моя собственная итерация каталога модулей Prism.

        • Проблема 1 - все модули

          Итерация содержимого XAP-файлов в модульном проекте кажется действительно удобной вещью, которую можно сделать по разным причинам, поэтому нужно добавить еще 100 повторений, чтобы получить реальный ответ (предпочтительно рабочий пример кода). Ура и удачи!

          Ниже приведено частичное решение (работает, но не оптимально):

          Ниже приведен код, который я придумал, который представляет собой комбинацию методов из по этой ссылке на встроенных ресурсах (как было предложено Otaku) и моя собственная итерация каталога модулей Prism.

          • Проблема 1 - все модули который представляет собой сочетание методов из , этой ссылки на Встроенные ресурсы (как было предложено Otaku) и моей собственной итерации Каталога модулей Prism.

            • Проблема 1 - все модули который представляет собой сочетание методов из , этой ссылки на Встроенные ресурсы (как было предложено Otaku) и моей собственной итерации Каталога модулей Prism.

              • Проблема 1 - все модули уже загружен, так что это в основном нужно загрузить их все за секунду время, как я не могу понять, как перебрать все загруженные в данный момент модули Prism. Если кто-то хочет поделиться наградой на этом вы все еще можете помочь сделать это полное решение!

              • Проблема 2 - Очевидно, это ошибка в ResourceManager, который требует вы получите поток известных ресурс, прежде чем он позволит вам перебрать все элементы ресурсов (см. примечание в коде ниже). Это означает, что у меня должен быть фиктивный файл ресурсов в каждом модуле. Было бы неплохо узнать, почему требуется этот первоначальный вызов GetStream (или как его избежать).

                 private void ParseAllXamlInAllModules ()
                {
                 IModuleCatalog mm = this.UnityContainer.Resolve  ();
                 foreach (модуль var в миллиметрах. модули)
                 {
                 строка xap = module.Ref;
                 WebClient wc = новый WebClient ();
                 wc.OpenReadCompleted + = (s, args) =>
                 {
                 если (args.Error == null)
                 {
                 var resourceInfo = новый StreamResourceInfo (args.Result, null);
                 var file = new Uri ("AppManifest.xaml", UriKind.Relative);
                 var stream = System.Windows.Application.GetResourceStream (resourceInfo, файл);
                 Читатель XmlReader = XmlReader.Create (stream.Stream);
                 var parts = new AssemblyPartCollection ();
                 если (reader.Read ())
                 {
                 reader.ReadStartElement ();
                 if (reader.ReadToNextSibling ("Deployment.Parts"))
                 {
                 while (reader.ReadToFollowing ("AssemblyPart"))
                 {
                 parts.Add (new AssemblyPart () {Source = reader.GetAttribute ("Source")});
                 }
                 }
                 }
                 foreach (часть var по частям)
                 {
                 var info = new StreamResourceInfo (args.Result, null);
                 Сборка assy = part.Load (System.Windows.Application.GetResourceStream (информация, новый Uri (part.Source, UriKind.Relative)). Stream);
                 // Получаем имена встроенных ресурсов
                 строка [] ресурсы = assy.GetManifestResourceNames ();
                 foreach (ресурс var в ресурсах)
                 {
                 если (! resource.Contains ("DummyResource.xaml"))
                 {
                 // чтобы получить актуальные значения - создаем таблицу
                 var table = new Dictionary  ();
                 // Все ресурсы имеют в названии «.resources» - удалите его
                 var rm = new ResourceManager (resource.Replace (". resources", String.Empty), assy);
                 // Кажется, здесь какая-то проблема, но без получения реального потока следующий оператор не работает ....
                 var dummy = rm.GetStream ("DummyResource.xaml");
                 var rs = rm.GetResourceSet (Thread.CurrentThread.CurrentUICulture, false, true);
                 Перечислитель IDictionaryEnumerator = rs.GetEnumerator ();
                 пока (перечислитель.MoveNext ())
                 {
                 if (enumerator.Key.ToString (). EndsWith (". xaml"))
                 {
                 table.Add (enumerator.Key.ToString (), enumerator.Value as Stream);
                 }
                 }
                 foreach (var xaml в таблице)
                 {
                 TextReader xamlreader = новый StreamReader (xaml.Value);
                 строковое содержимое = xamlreader.ReadToEnd ();
                 {
                 // Здесь я работаю над содержимым XAML
                 }
                 }
                 }
                 }
                 }
                 }
                 };
                 // Выполняем фактическое чтение для запуска вышеуказанного кода обратного вызова
                 wc.OpenReadAsync (новый Uri (xap, UriKind.RelativeOrAbsolute));
                 }
                }
                

8
задан Gone Coding 14 September 2010 в 14:34
поделиться