CRM 2011, ILMerge и локализация - PullRequest
5 голосов
/ 22 ноября 2011

У меня возникли проблемы при объединении сборок сателлитов локализации в библиотеку плагина для CRM2011.

Либо так, либо я не знаю, как впоследствии использовать объединенные ресурсы.

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

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

Эта команда используется для объединения дополнительной сателлитной сборки:

ilmerge /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /log:log.txt /keyfile:KeyFile.snk /out:Plugins.dll DynamicsCRM2011.Plugins.dll pl-PL\DynamicsCRM2011.Plugins.resources.dll

AsВы можете видеть, что плагины находятся в .NET 4.0, и у меня есть требуемый файл .config для ILMerge, чтобы использовать необходимые сборки для слияния.

Сгенерированный файл выглядит нормально, я могу зарегистрировать его с помощью плагина CRM-регистратор, добавлять новые шаги и т. д.

Однако он всегда будет использовать язык по умолчанию.Я пытался изменить System.Threading.Thread.CurrentThread.UICulture, но это не помогло.Когда я создал ResourceManager класс и использовал GetString("ErrorMessage", new System.Globalization.CultureInfo("pl-PL")), я получил Exception, что указанный ResourceManager не знает, что делать с указанной культурой.

Я знаю этот вопрос здесь .Однако опубликованное решение кажется устаревшим.Сгенерированные файлы ресурсов .cs не используют ComponentResourceManager.Кроме того, части кода, размещенного там, были помечены как устаревшие.

Я не совсем уверен, что я должен делать сейчас, или как дальше отлаживать это, так как у меня очень мало опыта, когда онприходит работать с самими сборками.Пожалуйста, помогите мне контролировать эти спутниковые сборки.


Обновление:

Я уже некоторое время работаю с плагинами песочницы, и поэтому ябольше не иметь доступа к таким вещам, как CurrentCulture (или, по крайней мере, я не могу изменить такие вещи).Я попытался решить эту проблему еще раз: я создал простой плагин, который запускается при сохранении новой учетной записи.Ничего фантастического.Вот фактический код плагина:

        ResourceManager rm = new ResourceManager(typeof(Properties.Resources));
        var s = rm.GetString("ErrorAlreadyPosted", new System.Globalization.CultureInfo("pl-PL"));
        throw new InvalidPluginExecutionException(s);

Код больше не выдает исключение из-за невозможности найти указанную культуру ... также код явно выдает исключение в конце, но важно то, чтоЧто такое сообщение об исключении.Я ожидаю, что это будет на польском языке.

Увы, это не так.Строка, возвращаемая GetString, по-прежнему на английском языке.

Команда, которую я использовал для ILmerge, такая же, как и раньше, но с указанным параметром /lib, поэтому мне не нужно копировать всю CRMSDK dlls ...

Ответы [ 3 ]

1 голос
/ 03 декабря 2014

Очевидно, что невозможно читать ресурсы в контексте плагина.

Читать на MSDN: http://msdn.microsoft.com/en-us/library/hh670609.aspx#BKMK_UseXMLWebResourcesAsLanguageResources

Цитата: Когда плагину требуется локализованный текст, вы можете использовать веб-ресурс XML для хранения локализованных строк, чтобы плагин мог получить к ним доступ при необходимости. Вы можете выбрать структуру XML, но вы можете придерживаться структуры, используемой файлами ресурсов ASP.NET (.resx) для создания отдельных веб-ресурсов XML для каждого языка. Например, ниже приведен веб-ресурс XML с именем localizedString.en_US, который следует шаблону, используемому файлами .resx.

Это все, что я знаю до сих пор - мне еще предстоит создать собственное решение для локализации плагина crm.

0 голосов
/ 22 июля 2018

Способ, которым мы в конечном итоге справились с этим, путем добавления XML-файлов локализации (сгенерированных Visual Studio) в качестве ресурсов CRM и создания небольшого количества пользовательского кода, который ищет соответствующий ресурс, а затем ищет текст локализации внутри.

Очевидно, что это не так просто, как просто использовать сгенерированный класс локализации C #, и требует некоторой подготовительной работы.Однако с этой подготовительной работой и использованием nameof теперь почти так же просто, как и вышеупомянутые классы ресурсов.

0 голосов
/ 17 декабря 2011

Если вы используете инструмент рефлектора для просмотра сгенерированной сборки, видите ли вы, что ваш ресурс (-ы) вставлен правильно? Возможно, вы столкнулись с ошибкой, описанной в указанной вами ссылке.

Попробуйте установить Thread.CurrentThread.CurrentUICulture и \ или Thread.CurrentThread.CurrentCulture.

Также попробуйте подключиться к AppDomain.CurrentDomain.AssemblyLoad и \ или AppDomain.CurrentDomain.AssemblyResolve, чтобы отладить, какие сборки пытаются загрузить и откуда. Возможно, вам придется настроить их поведение так, чтобы вместо загрузки внешней сборки вместо этого загружался внутренний ресурс.

Вы можете попробовать встроить ссылки на проекты в качестве ресурсов вместо использования ilmerge.
Смотрите это: http://bartlomiej.net/dotnet/embeded-assembies-into-an-executable/

...