Спутниковые сборки со строгими именами, использующие ResGen & AL с несколькими файлами resx / resources
По какой-либо причине при компиляции нескольких файлов.resources в одну спутниковую сборку (.dll) ресурсы не будут отображаться. Компиляция одного ресурса будет работать. Вот шаги, которые я использовал...
- У нас есть проект под названием "Средство просмотра отчетов". Этот проект подписан с использованием ключа MySnKey.snk через Свойства> Подписывание> Подписать сборку, выберите файл ключа строгого имени: MySnKey.snk.
- Все формы были обновлены до Localizable = True
- Мы обработали все файлы resx на немецком языке de-DE. Существует только два resx: MainForm.resx (корневой каталог проекта) и Resources.resx (каталог свойств).
- У меня есть папка с MainForm.de-DE.resx и Resources.de-DE.resx, которые являются переведенными версиями этих файлов.
Используя Resgen,
> "C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ bin \ ResGen" / compile Resources.de-DE.resx ReportViewer.Resources.de-DE.resources
> "C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ bin \ ResGen" / compile MainForm.de-DE.resx ReportViewer.MainForm.de-DE.resources
Это создает соответствующие файлы.resources. Теперь, чтобы связать, я использую AL.exe:
> "C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ bin \ AL" / t: lib /embed:ReportViewer.MainForm.de-DE.resources,ReportViewer.Resources.de-DE.resources / culture: de-DE /out:ReportViewer.resources.dll /template:../../../Output/ReportViewer/bin/Debug/ReportViewer.exe /keyfile:../MySnKey.snk
Это создает файл ReportViewer.resources.dll. Если я помещу его в соответствующую подпапку de-DE>ReportViewer.resources.dll, не повезло. В Program.cs перед вызовом Run у меня есть
Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");
ЕСЛИ я включаю только MainForm как
> "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\AL" /t:lib /embed:ReportViewer.MainForm.de-DE.resources /culture:de-DE /out:ReportViewer.resources.dll /template:../../../Output/ReportViewer/bin/Debug/ReportViewer.exe /keyfile:../MySnKey.snk
Соответствующие ресурсы отображаются.
Это довольно смущает меня. Если я добавлю файлы.resx в решение и скомпилирую, выходной dll будет работать правильно, но мы пытаемся избежать необходимости использовать эти спутниковые переводы в решении.
Ошибки не генерируются, а файлы создаются, поэтому я теряюсь в том, что я не делаю.
Любая помощь с благодарностью. Я сравнил различия между выходными dll при добавлении файлов в решение к выходному файлу при запуске AL.exe, и они оба содержат все переводы.
РЕДАКТИРОВАТЬ, чтобы включить решение, так как я не могу ответить на вопрос
Видимо я запутался с опцией встраивания и ее использованием. Чтобы правильно использовать утилиту AL.exe, мне пришлось использовать:
> "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ResGen" Resources.de-DE.resx ReportViewer.Properties.Resources.de-DE.resources
Обратите внимание, что добавлено пространство имен Properties. Я не делал этого раньше.
> "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ResGen" MainForm.de-DE.resx ReportViewer.MainForm.de-DE.resources
Обратите внимание, что пространство имен Properties не добавляется, поскольку MainForm находится в Пространстве имен ReportViewer.
> "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\AL"
/t:lib
/embed:ReportViewer.Properties.Resources.de-DE.resources
/embed:ReportViewer.MainForm.de-DE.resources
/culture:de-DE /out:ReportViewer.resources.dll /template:../../../Output/ReportViewer/bin/Debug/ReportViewer.exe /keyfile:../MySnKey.snk
Обратите внимание, что в этой строке есть несколько элементов для вставки. Я использовал запятую, которая переименовывает внутренности и не то, что я хотел. Предоставление пробела между файлами дает (казалось бы) несвязанную ошибку. Смотрите http://ondotnet.com/pub/a/dotnet/2002/10/14/local2.htm?page=2 для отличной статьи.
Для полноты, другой способ написания этого сценария будет
> "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ResGen" Resources.de-DE.resx
обратите внимание, что переименование здесь не производится, вывод просто Resources.de-DE.resources
> "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ResGen" MainForm.de-DE.resx
обратите внимание, что переименование здесь не производится, вывод просто MainForm.de-DE.resources
> "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\AL" /t:lib
/embed:Resources.de-DE.resources,ReportViewer.Properties.Resources.de-DE.resources
/embed:MainForm.de-DE.resources,ReportViewer.MainForm.de-DE.resources
/culture:de-DE
/out:ReportViewer.resources.dll /template:../../../Output/ReportViewer/bin/Debug/ReportViewer.exe /keyfile:../MySnKey.snk
Обратите внимание, что переименование выполняется после запятой в опции embed. Первый аргумент - это имя файла (файл.resources), а после запятой - полное имя (namespace.class.xx-XX.resources).
1 ответ
Ответил в посте, прежде чем я знал, что смогу ответить здесь.