Спутниковые сборки со строгими именами, использующие ResGen & AL с несколькими файлами resx / resources - PullRequest
0 голосов
/ 29 марта 2012

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

  1. У нас есть проект под названием «Средство просмотра отчетов». Этот проект подписан с использованием ключа MySnKey.snk через Свойства> Подписывание> Подписать сборку, выберите файл ключа строгого имени: MySnKey.snk.
  2. Все формы были обновлены до Localizable = True
  3. Мы обработали все файлы resx на немецком языке de-DE. Существует только два resx: MainForm.resx (корневой каталог проекта) и Resources.resx (каталог свойств).
  4. У меня есть папка с MainForm.de-DE.resx и Resources.de-DE.resx, которые являются переведенными версиями этих файлов.
  5. Использование 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 Ответ

0 голосов
/ 12 октября 2012

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

...