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