Можно ли использовать портативную библиотеку с локализованными ресурсами в универсальном приложении?

(Там есть ссылка внизу к решению с воспроизведением проблемы.)

Я довольно долго использовал портативную библиотеку с ресурсами .resx, поскольку она работала как для приложений Windows Store, так и для приложений Windows Phone. Я также пытался использовать его с универсальным приложением, и он работает для части Windows Store, но не работает для Windows Phone.

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

Error : DEP6810 : MdilXapCompile.exe failed with error code 1004. See log file
'...\Phone App Test\Phone App Test\obj\Release\MDIL\MDILXapCompileLog.txt' for more details.

И в этом файле:

Error: Compile filter argument specified non-existent file:
...\Phone App Test\Phone App Test\obj\Release\MSIL\en-US\PCL.resources.dll
Invalid argument

Файл действительно не существует, но приложение не поддерживает культуру en-US в любом случае, только библиотека делает это, поэтому я не думаю, что этот файл должен быть необходим.

Как я могу решить эту проблему?

Здесь простое решение с проблемой: ссылка

Ответ 1

У вас могут быть файлы .resx в pcls, вам просто нужно использовать обходное решение, описанное в http://blogs.msdn.com/b/philliphoff/archive/2014/11/19/missingmanifestresourceexception-when-using-portable-class-libraries-in-winrt.aspx

Даже при последнем обновлении VS 2013 (обновление 5) при попытке развернуть пакеты Release будет отображаться ошибка mdil.

Ошибка MdilXapCompile.exe с кодом ошибки 1004

Чтобы обойти это, вы должны скомпилировать свое приложение, используя опцию хранилища, а затем использовать инструмент "Развертывание приложений" для фактического развертывания его на устройстве.

Ответ 2

К сожалению, обходной путь, описанный в блоге Фила Хоффа, слишком сработал у меня. Я разработал свое собственное решение. Оказывается, если вы используете .resx файлы только для хранения значений строк, вы можете легко их преобразовать в .resw и использовать изначально в Windows Phone 8.1.

Итак, что я делаю, это копирование и преобразование ресурсов из PCL и размещение в качестве исходных ресурсов .resw в проекте Windows Phone, каждый из которых автоматически создается с помощью инструмента, который я создал - ResxHell. Просто следуйте инструкциям в репозитории, и затем вы можете достичь таких ресурсов, как это.

var resourceLoader = new ResourceLoader();
var localizedText = resourceLoader.GetString("MyCustomReswFile/MyStringId");

Для хорошего привязки я закончил создание ValueConventer и небольшого вспомогательного класса локализации, взгляните на эту суть: Связывание с примером .resw файлов

С помощью этого вы можете сделать следующее на своих страницах xaml:

//For resource in file Page.Login.resw and string ID "NotUserYet"
<TextBlock Text="{Binding ConverterParameter=Page.Login/NotUserYet, Converter={StaticResource ResString}, Mode=OneWay, Source={StaticResource ResString}}"/>

или string localizedtext = LocalizationHelper.GetString("MyCustomReswFile", "MyStringId");

Ответ 3

Я обнаружил, что это уже сообщается в ms connect

https://connect.microsoft.com/VisualStudio/feedback/details/991028/issue-using-resx-files-on-winrt-apps-windows-phone-and-windows

и есть обходной путь, который я еще не пробовал.

http://blogs.msdn.com/b/philliphoff/archive/2014/11/19/missingmanifestresourceexception-when-using-portable-class-libraries-in-winrt.aspx

К сожалению, до сих пор он не был исправлен.

Ответ 4

Вы, конечно же, сняли флажок "Build" в Configuration Manager, поэтому ресурсы не копируются автоматически. Проверьте его, и он будет работать.

Ответ 5

В конце концов, похоже, вы не можете использовать библиотеку PCL с локализованными ресурсами, используя файлы .resx в WP-части универсального приложения. По крайней мере, это не тривиально.

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

Ответ 6

Была та же проблема. Я попробовал развертывание через Windows Phone Deployment Tool, и он сработал. Поэтому вместо того, чтобы использовать Visual Studio для развертывания: создавайте пакеты и помещайте их на телефон, и это работает!