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

По какой-либо причине при компиляции нескольких файлов.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 ответ

Решение

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

Другие вопросы по тегам