Проблема в Visual Studio 2010, изменение ресурсов устанавливает внутренний конструктор - PullRequest
4 голосов
/ 21 января 2011

Я испытываю странное поведение Visual Studio 2010 при разработке приложений Silverlight и использовании ресурсов проекта (.resx)

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

Есть идеи, как это исправить?

Не знаю, влияет ли это только на проекты Silverlight или вообще на все C #проекты.

Ответы [ 5 ]

3 голосов
/ 21 января 2011

Эта ссылка может помочь.

http://blogs.msdn.com/b/silverlight_sdk/archive/2010/09/08/ach-du-lieber-a-tour-of-some-localization-gotchas-in-silverlight.aspx

Там написано:

Оказывается, есть недостаток в VS построить логику действий здесь; к несчастью изменение этого действия инструмента не будет перевернуть уровень доступа класса конструктор от внутреннего к общественному (по крайней мере, не для сильно типизированных язык). Общественный конструктор еще одно требование Silverlight Использование класса XAML. У вас будет сделать это самостоятельно вручную в Файл designer.cs.

Надеюсь, это поможет

EDIT: -

Вот еще один http://www.wintellect.com/CS/blogs/jprosise/archive/2010/06/21/dynamic-localization-in-silverlight.aspx, который говорит

Наконец, Visual Studio страдает от давняя ошибка, которая оставляет конструктор ResourceManager класс-обёртка, который генерирует помеченный внутренний, когда вы меняете класс модификатор доступа к общественности. Это означает что всякий раз, когда вы изменяете основной Файл RESX, заставляющий код регенерировать, вы должны вручную изменить внутренний на публика на конструкторе в сгенерированный код. Это бьет меня, почему это не было исправлено после всех этих лет, но это не так.

2 голосов
/ 03 марта 2012

Мой подход заключается в настройке события предварительной сборки , которое заменяет «internal» на «public» в вашем файле .Designer.cs У меня есть сообщение в моем блоге о всего процесса, от создания локализованной строки до их привязки и настройки командной строки события перед сборкой.

Суть процесса заключается в том, чтобы получить утилиту замены текстового файла (скажем, она называется REPLACE.EXE) и установить действие перед сборкой, например:

c: \ utility \ replace \ replace.exe "$ (ProjectDir) \ LocalizedStrings.Designer.cs" "internal" "public"

$ (ProjectDir) - это встроенный макрос VS, который возвращает путь к папке вашего проекта.

Я также привел пример такой простой замены исходного кода утилиты в том же посте.

1 голос
/ 11 апреля 2014

Обходной путь:

Наследуйте другой класс от сгенерированного

public class TextRes2 : TextRes
{
  public TextRes2() { }
}

и используйте его вместо исходного

<ResourceDictionary>
  <!--res:TextRes x:Key="Strings" /-->
  <res:TextRes2 x:Key="Strings" />
</ResourceDictionary>
1 голос
/ 30 ноября 2011

Лучшее решение - переключить инструмент, используемый для генерации кода ресурса в файле .cs, на один, который автоматически выводит конструктор как открытый, а не внутренний. Лучший из найденных мной - Гай Смит-Ферье . Загрузите и запустите установщик , а затем измените свойство «Custom Tool» вашего файла ресурсов .resx на «PublicResourceCodeGenerator».

0 голосов
/ 22 сентября 2016

Существует проблема со всеми этими решениями - по крайней мере, в нашем случае.

Все наши файлы ресурсов модифицируются сторонним инструментом codegen, который обновляет файлы ресурсов в соответствии с изменениями, внесенными в пользовательский интерфейс.Все, что он делает, это обновляет строки в XML.нам все еще нужно войти в VS и переключить модификатор доступа с Public на что-то еще, и обратно на Public, чтобы VS синхронизировал код, чтобы соответствовать новым строковым значениям.ТОГДА нам нужно обновить c #, изменив внутренний на публичный.

Так что нам нужно автоматизировать оба шага, перестроить код и исправить внутреннее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...