2009-08-26 2 views
39

В моем веб-проекте я использую 4 файла ресурсов в своей папке App_GlobalResources. Один из них (lang.resx) был создан до моего прибытия в проект. Он имеет правильное пространство имен (WebApplication.App_GlobalResources) и модификатор доступа: public.Изменение пространства имен файлов (resx) и модификатора доступа

С другой стороны, три других файла ресурсов, которые я только что создал, имеют другое пространство имен (Resources) и internal модификатор доступа, и я не могу его изменить в форме файла ресурсов из Visual Studio, потому что он отключен. Если я попытаюсь изменить его непосредственно в файле designer.cs, изменения будут отменены при следующем сохранении файла.

Это не критическая ошибка, но другие разработчики проекта могут вводить в заблуждение, чтобы найти разные пространства имен и модификаторы доступа для файлов ресурсов, которые они будут использовать.

ответ

42

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

Когда я попытался следовать this article, я также наткнулся на эту проблему. После загрузки исходных файлов, как автор предложил, я заметил, что файл ресурсов, который уже присутствовал, имел следующий класс в свойстве «Custom Tool»: «PublicResXFileCodeGenerator». Кроме того, для свойства Build Action установлено значение «Embedded Resource», но я не уверен, что это часть проблемы.

Любой новый файл ресурсов, который я создал, использовал настраиваемый инструмент «GlobalResourceProxyGenerator». После перезаписи этого с вышеупомянутым «PublicResXFileCodeGenerator», похоже, решалась проблема, какова бы ни была реальная проблема.

Я также заметил, что настоящий файл ресурсов находился в формате «2.0», тогда как новые файлы находились в формате «1.3». Это можно увидеть, открыв файл resx с помощью редактора XML (или используя «open with» из самой визуальной студии).

Надеюсь, вы можете заставить его работать так, но это не идеально. Вероятно, это проблема установки с Visual Studio 2008 и SP1, или что-то в этом роде.

Update:

This blog entry также может помочь.

+0

Очень полезная запись в блоге. Благодаря! – ongle

+0

Это также происходит в VS2010: копирование + вставка файла resx в проект, возможно, была проблемой, он устанавливает файл .resx в GlobalResourceProxyGenerator, если вы это сделаете. –

6

Resx выбирает пространство имен в зависимости от пространства имен, указанного в конфигурации проекта Visual Studio. Обновите проект, чтобы иметь правильное пространство имен, и resx должен наследовать его (новые наверняка, не уверены, что существующие будут исправлены - они должны).

+0

пространство имен проектов по умолчанию кажется хорошим: 'WebApplication' –

4

Модификаторы доступа к ресурсам в файле находятся в .csproj;

Изменение непосредственно файла .csproj должно решить эту проблему.

Посмотрите на <Generator> элемент и установите его значение в соответствии с примерами ниже:

Файл ресурсов с internal модификатором выглядит так,

<ItemGroup> 
<EmbeddedResource Update="resources.resx"> 
    <Generator>ResXFileCodeGenerator</Generator> 
    <LastGenOutput>resources.Designer.cs</LastGenOutput> 
</EmbeddedResource> 
</ItemGroup> 

где файл ресурсов с public модификатором выглядит это.

<ItemGroup> 
<EmbeddedResource Update="resources.resx"> 
    <Generator>PublicResXFileCodeGenerator</Generator> 
    <LastGenOutput>resources.Designer.cs</LastGenOutput> 
</EmbeddedResource> 
</ItemGroup> 
+0

Было бы полезно, если бы вы расширили свой ответ, чтобы он также сказал * где * в '.csproj', который должен выглядеть. Насколько я могу судить, просто используется другой генератор ('PublicResXFileCodeGenerator' вместо' ResXFileCodeGenerator'). Это также должно быть доступно для редактирования в окне VS 'Properties для элемента проекта .resx. – stakx

+0

спасибо @stakx; Я добавил примеры как предложено –

10

Или вы можете изменить атрибут CustomTool (проверен на VS2010).

Вы просто должны открыть свойство файла, файл ресурсов и изменить «Custom Tool» от «GlobalResourceProxyGenerator» в «PublicResXFileCodeGenerator», который является инструментом по умолчанию для локальных файлов ресурсов. Затем вам нужно изменить «Build Action» на «Embedded Resource». Вы также можете назначить правильный пользовательский инструмент пространство имен, как «Ресурсы», чтобы получить доступ к файлу правильно, но это не надо ...

Source

+0

Позаботьтесь о том, кто использует ASP.NET, потому что при публикации с «Embedded Resource» это может не публиковаться на сервере. «Build Action» как «Content» работает нормально, хотя –

44

Быстрый ответ: Просто откройте Свойства файла ресурсов и измените значение Custom Tool Namespace на нужное пространство имен.
Просто как это.

+3

Самый простой ответ для VS2012 –

Смежные вопросы