«Запустить Custom Tool» для файлов resx в проекте MVC2 (из внешнего приложения / скрипта) - PullRequest
3 голосов
/ 12 июля 2010

Я пытаюсь заставить локализацию для моего проекта MVC работать с нашей существующей инфраструктурой для редактирования строковых ресурсов.Мы храним все наши строки ресурсов в таблицах базы данных и имеем интерфейс веб-интерфейса для их редактирования, а также приложение для экспорта, которое сгенерировало файлы .resx.Все это прекрасно работает, но у меня возникли небольшие трудности с новым проектом, использующим MVC2 и VS2010.

Я задал еще один вопрос по этому вопросу, ответ на который почти привел меня туда,но не совсем.

Теперь я изменил ресурсы, чтобы они находились в папке «Ресурсы» (вместо App_GlobalResources), как рекомендовано многими людьми.И установите следующие параметры для моих файлов .resx ...

Build Action             = Embedded Resource
Copy to Output Directory = Do not copy
Custom Tool              = PublicResXFileCodeGenerator
Custom Tool Namespace    = Resources
File Name                = MyApp.resx

Я изменил свое приложение экспорта для запуска инструмента resgen.exe со следующими параметрами ...

string args = string.Format("/publicClass \"{0}\" /str:cs,Resources,{1},\"{2}\"", resourceFile, Path.GetFileNameWithoutExtension(resourceFile), csFilename);

... который генерирует почти идентичный файл .designer.cs, который я получаю, когда первоначально добавляю файл .resx в свой проект.Единственное отличие состоит в том, что

Сгенерированный файл .designer.cs несколько отличается от файла, который я получаю при запуске инструмента resgen.exe из моего приложения экспорта.

Это сгенерированный кодVS2010, когда я впервые добавляю файл .resx в мою папку «Ресурсы» ...

public static global::System.Resources.ResourceManager ResourceManager {
    get {
        if (object.ReferenceEquals(resourceMan, null)) {
            global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Resources.MyApp", typeof(MyApp).Assembly);
            resourceMan = temp;
        }
        return resourceMan;
    }
}

... разница при запуске инструмента resgen.exe заключается в том, что это префиксы MyCompany.MyApp в пространство имен в конструкторе ResourceManager

new global::System.Resources.ResourceManager("MyCompany.MyApp.Resources.MyApp", typeof(MyApp).Assembly);

Теперь, мне кажется, это ошибка в инструменте resgen.exe, потому что я сказал, что Пространство имен для моих ресурсов Ресурсы , а не MyCompany.MyApp.Resources .

Итак, есть ли решение / обходной путь для этой проблемы?

Единственное, что яМожно подумать, что в данный момент нужно пост-обработать сгенерированный файл .designer.cs с powershell и исправить его!

1 Ответ

6 голосов
/ 13 июля 2010

Наконец-то я решил проблему.

Я решил немного упростить ситуацию, разбив свои ресурсы на новую сборку под названием Resources . Затем я добавил свои файлы resx и установил свойства для них, как показано ниже ...

Build Action             = Embedded Resource
Copy to Output Directory = Do not copy
Custom Tool              = PublicResXFileCodeGenerator
Custom Tool Namespace    = Resources
File Name                = MyApp.resx

Затем я изменил свое приложение экспорта для запуска ...

resgen MyApp.resx /str:c#,Resources,MyApp,MyApp.designer.cs /publicClass

... и удалить * .resources из папки (созданной утилитой resgen.exe, но не обязательной)

Это избавило от префикса в конструкторе ResourceManager , а затем я просто добавил ссылку на мою новую сборку Resources в мое веб-приложение.

Я выполнил несколько тестов, чтобы убедиться, что все хорошо, включая переход к файлу .designer.cs и удаление одного из свойств, чтобы вызвать ошибку компилятора. Затем снова запустил мое приложение экспорта, и все снова заработало.

Итак, я счастливый зайчик!

...