Недопустимый файл resx файл не найден
Компонент, который я хочу определить Список свойств для:
Я получаю следующую ошибку, если я пытаюсь использовать компонент, например, в форме, и добавлять любые элементы в лист свойств или конструктор компонента к свойству DescriptorsAvailable
Ошибка 1 Недопустимый файл Resx. Не удалось загрузить тип System.Collections.Generic.List'1 [[TestProjectForProperty.Test.TypeDescriptorBase, TestProjectForProperty, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]], mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089, который используется в файле.RESX. Убедитесь, что в проект добавлены необходимые ссылки. Строка 134, позиция 5. \visual studio 2010\Projects\TestProjectForProperty\TestProjectForProperty\Form1.resx 134 5 TestProjectForProperty
В файле Resx есть поле данных с кодировкой base64 внутри этой ошибки.
Создание RESX-файла
Для создания RESX-файла программным способом можно использовать класс System.Resources.ResXResourceWriter , выполнив следующие действия.
Создайте экземпляр объекта ResXResourceWriter , вызвав метод ResXResourceWriter(String) и указав имя RESX-файла. Имя файла должно включать в себя расширение RESX. Если экземпляр объекта ResXResourceWriter создается в блоке using , явный вызов метода ResXResourceWriter.Close на шаге 3 не требуется.
Вызовите метод ResXResourceWriter.AddResource для каждого ресурса, который необходимо добавить в файл. Используйте перегрузки этого метода для добавления строки, объекта и двоичных данных (массива байтов). Если ресурсом является объект, он должен быть сериализуемым.
Вызовите метод ResXResourceWriter.Close для создания файла ресурсов и освобождения всех ресурсов. Если объект ResXResourceWriter был создан в блоке using , ресурсы записываются в RESX-файл, а ресурсы, используемые объектом ResXResourceWriter , освобождаются в конце блока using .
В полученном RESX-файле имеется соответствующий заголовок и тег data для каждого ресурса, добавленного методом ResXResourceWriter.AddResource .
Не следует использовать файлы ресурсов для хранения паролей, конфиденциальной информации или личных данных.
В следующем примере создается RESX-файл с именем CarResources.resx, в котором хранятся шесть строк, значок и два объекта, определяемых приложением (два объекта Automobile ). Класс Automobile , определенный и созданный в этом примере, отмечен атрибутом SerializableAttribute.
Для создания RESX-файлов можно также использовать Visual Studio. Во время компиляции Visual Studio использует генератор файлов ресурсов (Resgen.exe) для преобразования RESX-файла в двоичный файл ресурсов (RESOURCES-файл) и внедряет этот файл в сборку приложения или вспомогательную сборку.
RESX-файл нельзя внедрить в исполняемый файл или скомпилировать во вспомогательную сборку. Необходимо преобразовать RESX-файл в двоичный файл ресурсов (RESOURCES-файл) с помощью генератора файлов ресурсов (Resgen.exe). Затем полученный RESOURCES-файл можно внедрить в сборку приложения или вспомогательную сборку. Дополнительные сведения см. в разделе Создание файлов ресурсов.
4 ответа
3 Решение Marwie [2014-07-11 14:53:00]
Поместите MyTreeView и TypeDescriptorBase в другой проект и MyTreeView нему из своего проекта GUI, чтобы решить проблемы.
Я не уверен, почему именно проблема возникает - я думаю, это связано с тем, как процесс сериализации генерирует строку base64 для свойства DescriptorsAvailable. Может быть, кто-то еще может дать нам некоторое представление.
По моему опыту, это связано с изменением версии ссылочной библиотеки или изменением самой библиотеки, которая содержит тип поддержки свойства, который вы определили в своем пользовательском элементе управления. Решение состоит в том, чтобы "заставить" дизайнера визуальной студии повторно инициализировать его код разработчика для этого типа и не ожидать получения "консервированной" версии из файла.resx элемента управления.
1) Удалите раздел оскорбительных данных в файле.resx вашего элемента управления. Это будет раздел в xml файла.resx, связанный с вашим пользовательским элементом управления, который имеет узел: - атрибут name будет установлен на то, что вы назвали этим объектом в свойствах независимо от того, к чему вы добавили этот тип. Раздел /data> содержит строку с кодировкой base64, которая является кодированной формой имени и версии библиотеки, из которой получен тип. Здесь проблема ism, поскольку теперь она содержит кодированную версию библиотеки и/или номер версии, на которую вы больше не ссылаетесь, чтобы включить этот тип. Удалите весь раздел /data> , от открытия до закрывающего тега, сохраните изменения и закройте файл. Теперь "артефакт" исчез.
2) Теперь найдите место в файле конструктора для вашего элемента управления, где создается экземпляр типа; это код инициализации, созданный для вас визуальной студией, и это место, которое ожидает загрузки "консервированного" определения типа из кодированной base64 строки, содержащейся в файле.resx. Строка будет выглядеть примерно так:
. теперь просто замените вызов resources.GetObjec с созданием нового экземпляра соответствующего типа, например:
. теперь сохраните изменения в файле, закройте его, перестройте, и теперь все должно быть построено и работать нормально.
Для меня эта ошибка возникла, когда я использовал пользовательский класс как свойство для пользовательского элемента управления. Когда я переключился с свойств на традиционные методы get- и set-, ошибка исчезла. Я предполагаю, что это связано с тем, что свойства уже скомпилированы во время разработки, поэтому, когда вы строите весь проект, скомпилирована новая версия пользовательского класса, которая отделена от одного элемента управления, а ссылка нарушена.
Для меня, с пользовательским классом Inventory, все, что мне нужно было сделать, это перейти от этого подхода, основанного на свойствах:
Надеюсь, это поможет кому-то, поскольку я потратил несколько часов на выяснение этого.
Я немного потрудился с этим; У меня есть три пользовательских элемента управления, которые выставляют одно и то же свойство без конструктора, но по какой-то причине любое изменение на два из трех мгновенно приведет к сбою следующей сборки с этой же проблемой. Это в VS 2015.
Мне пришлось добавить следующие два атрибута в свойство, которое продолжало расширяться в файле resx, и с тех пор оно не произошло. Это работает для меня, потому что они все равно недоступны дизайнеру.
Здесь рассматривается работа с XML-файлами (RESX-файлами), содержащими ресурсы. Сведения о работе с двоичными файлами ресурсов, внедренными в сборки, см. в статье ResourceManager.
Существуют также способы работы с RESX-файлами, отличные от программных. При добавлении в проект Visual Studio файла ресурсов среда Visual Studio предоставляет интерфейс для создания и обслуживания RESX-файла и во время компиляции автоматически преобразует RESX-файл в RESOURCES-файл. Для непосредственной работы с RESX-файлом можно также использовать текстовый редактор. Однако следует соблюдать осторожность и избегать изменения содержащихся в файле двоичных данных: это может привести к его повреждению.
Получение определенного ресурса
В следующем примере извлекается строка заголовка и значок формы по именам ресурсов. В нем также извлекаются определяемые приложением объекты Automobile , использованные в предыдущем примере, и эти объекты отображаются в элементе управления DataGridView.
обновление
It (Ресурсы.resx) был на самом деле (под свойствами), поэтому я думаю, что "не может быть найден" означает: "мне не нравится тот, который вы дали мне."
когда я размял F6, чтобы дать ему еще одну попытку, я получил предупреждение: "пользовательский инструмент" ResXFileCodeGenerator "связан с файлом" свойстваресурсы.resx', но вывод пользовательского инструмента не был найден в проекте. Вы можете попробовать повторно запустить пользовательский инструмент, щелкнув правой кнопкой мыши файл в обозревателе решений и выбрав запустить пользовательский инструмент."
также: "пользовательский инструмент" SettingsSingleFileGenerator "связан с файлом" свойстванастройки.настройки, но вывод пользовательского инструмента не найден в проекте. Вы можете попробовать повторно запустить пользовательский инструмент, щелкнув правой кнопкой мыши файл в обозревателе решений и выбрав запустить пользовательский инструмент."
Я запустил "запустить пользовательский инструмент" для обоих ресурсов.resx и настройки.настройки, и все равно получите ту же ошибку и два предупреждения.
Если вы скомпилировали проект в прошлом и у вас есть dll/exe, вы можете использовать приложение DotPeek JetBrains для экспорта XML resx из сборки
откройте dll / exe в DotPeek
затем дважды щелкните каждый ресурс, чтобы увидеть XML в окне. Затем вы можете скопировать/вставить XML в текстовый редактор и сохранить как.файл resx.
Не беспокойтесь, щелкнув правой кнопкой мыши ресурс и попробовав опцию "Сохранить Ресурс в файл", как это не создает файл в том же формате, как вы видите на экране.
щелкните правой кнопкой мыши и удалить .проект форма resx файл щелкните правой кнопкой мыши по форме и обновите resource manager построить проект запустить проект
Я знаю, что этот вопрос немного старый, но у меня были проблемы с генерацией .ресурсы.dll-файлы и после недавнего изменения версии .NET Framework .Файлы resx еще включил старый .Net версии. Я смог решить эту проблему, открыв затронутые формы и перейдя в "Design" -> "Localizable" и изменив его на "False". Затем я построил проект, а затем изменил его обратно на "True" и the .Файл ResX был восстановлен.
У меня была эта проблема в форме, которую я создал для довольно обширного проекта. Я смог просто скопировать resx другой формы в том же проекте и изменить имя файла.
Я просмотрел более дюжины файлов resx в моем проекте и заметил, что большинство из них были идентичны; несколько, которые не были, отличались только одной или двумя дополнительными строками.
насколько я прочитал, нет способа регенерировать .файл resx, но вы можете пойти другим путем вы можете создать другое / такое же приложение win и все аспекты управления для него . Чем занять вновь созданный файл resx и добавить в старый проект. Попробуйте, может быть, это сработает
пользователи Visual Studio 2012-2015 Для веб-приложения просто выберите веб-элемент управления (ascx) или страницу (aspx), в которой отсутствует resx в обозревателе решений, перейдите в меню проект и выберите "Преобразовать в веб-приложение", нажмите OK в приглашении. Вы должны увидеть новые файлы под выбранным элементом в обозревателе решений.
вот как я решил это: я открыл отсутствующие вспомогательные файлы (AssemblyInfo.cs, Resources.resx файл, ресурсы.Дизайнер.cs, настройки.настройки и настройки.Дизайнер.cs) из другого проекта в блокноте удалил вещи, которые не принадлежали (например, ссылку на ThemeEditor или некоторые другие), изменил другие вещи по мере необходимости (имя приложения или пакета), и они были, наконец, приняты как принадлежащие моему приложению.
скопировать .resx файл любой другой формы в проекте в папку проекта и повторите попытку. У меня получилось.
Перечисление ресурсов
В некоторых случаях может потребоваться извлечь из RESX-файла все ресурсы, а не конкретный ресурс. Для этого можно использовать класс System.Resources.ResXResourceReader , предоставляющий перечислитель для всех ресурсов в RESX-файле. Класс System.Resources.ResXResourceReader реализует перечислитель IDictionaryEnumerator, который возвращает объект DictionaryEntry , представляющий конкретный ресурс для каждой итерации цикла. Его свойство DictionaryEntry.Key возвращает ключ ресурса, а свойство DictionaryEntry.Value — значение ресурса.
В следующем примере создается объект ResXResourceReader для файла CarResources.resx, созданного в предыдущем примере, а затем выполняются итерации по файлу ресурсов. В этом примере в объект Automobile добавляются два объекта System.Collections.Generic.List , определенные в файле ресурсов, а в объект SortedList добавляются пять строк из шести. Значения в объекте SortedList преобразуются в массив параметров, который используется для отображения заголовков столбцов в консоли. Значения свойства Automobile также выводятся на консоль.
Преобразование RESX-файлов в двоичные RESOURCES-файлы
Преобразование RESX-файлов во внедряемые двоичные файлы ресурсов (RESOURCES-файлы) имеет значительные преимущества. Хотя RESX-файлы легко читаются и обслуживаются при развертывании приложения, они редко поставляются с готовыми приложениями. Если они распространяются с приложением, то существуют в виде отдельных файлов наряду с исполняемым файлом приложения и сопровождающими его библиотеками. В отличие от RESX-файлов RESOURCES-файлы внедряются в исполняемый файл приложения или сопровождающие его сборки. Кроме того, если локализованные приложения полагаются на RESX-файлы во время выполнения, это означает, что ответственность за обработку перехода к другим ресурсам несет разработчик. Напротив, если создан ряд вспомогательных сборок, содержащих внедренные RESOURCES-файлы, процесс перехода на резервные ресурсы обрабатывается средой CLR.
Для преобразования RESX-файла в RESOURCES-файл используется генератор файлов ресурсов (resgen.exe), который имеет следующий базовый синтаксис:
Результат — двоичный файл ресурсов, который имеет такое же корневое имя файла, что и RESX-файл, и расширение RESOURCES-файла. Затем во время компиляции этот файл может быть компилирован в исполняемый файл или библиотеку. Если применяется компилятор Visual Basic, для внедрения RESOURCES-файла в исполняемый файл приложения используйте следующий синтаксис:
Затем RESOURCES-файл может быть также внедрен во вспомогательную сборку с помощью компоновщика сборок (al.exe), который имеет следующий базовый синтаксис:
Компонент, который я хочу определить Список свойств для:
Я получаю следующую ошибку, если пытаюсь использовать компонент, например, в форме и добавляю какие-либо элементы на листе свойств или в конструкторе компонента в свойство DescriptorsAvailable.
Ошибка 1 Неверный файл Resx. Не удалось загрузить тип System.Collections.Generic.List`1 [[TestProjectForProperty.Test.TypeDescriptorBase, TestProjectForProperty, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]], mscorlib, Version = 4.0.0.0, Culture = нейтральный PublicKeyToken = b77a5c561934e089, который используется в файле .RESX. Убедитесь, что в ваш проект добавлены необходимые ссылки. Строка 134, позиция 5. . \ Visual Studio 2010 \ Projects \ TestProjectForProperty \ TestProjectForProperty \ Form1.resx 134 5 TestProjectForProperty
В файле Resx есть поле данных с данными в кодировке base64, когда присутствует эта ошибка.
Поместите классы MyTreeView и TypeDescriptorBase в другой проект, и ссылка на них из вашего проекта графического интерфейса решит проблемы.
Я не уверен, почему именно возникает проблема - я предполагаю, что это как-то связано с тем, как процесс сериализации генерирует строку base64 для свойства DescriptorsAvailable. Может быть, кто-нибудь еще может дать нам некоторое представление.
Сегодня я наткнулся на этот вопрос, когда искал решение аналогичной проблемы.
В моем случае у меня есть ошибка: «Ошибка MSB3103: Недопустимый файл Resx. Указанный модуль не может быть найден» выполняется в контейнере легких окон на основе mcr.microsoft.com/powershell вместо mcr.microsoft.com/windows. : 1909 (отлично работал на 1909). Ошибка была в значке ресурса, который был сжат с PNG внутри. Это можно проверить, открыв ресурс в Visual Studio: Проект> Свойства> Ressources.resx, выберите значки, дважды щелкните значок, проверьте конец заголовка, который является либо «. BMP]», либо «. , PNG] "). Обновление значка в несжатом формате решает проблему «Недопустимый файл Resx».
Для меня эта ошибка возникла, когда я использовал настраиваемый класс в качестве свойства для пользовательского элемента управления. Когда я переключился с property на традиционные методы get и set, ошибка исчезла. Я предполагаю, что это связано с тем, что свойства уже скомпилированы во время разработки, поэтому, когда вы создаете весь проект, компилируется новая версия настраиваемого класса, которая отделена от одной из элементов управления, и ссылка не работает.
Для меня с настраиваемым классом Inventory все, что мне нужно было сделать, это переключиться с этого подхода, основанного на свойствах:
К этому подходу, основанному на методе:
Я надеюсь, что это кому-то поможет, так как я потратил несколько часов на то, чтобы понять это.
Я немного боролся с этим; У меня есть три пользовательских элемента управления, которые предоставляют одно и то же свойство, не относящееся к конструктору, но по какой-то причине любое изменение двух из трех немедленно приведет к сбою следующей сборки с той же проблемой. Это в VS 2015.
Мне пришлось добавить следующие два атрибута к свойству, которое продолжало расширяться в файле resx, и с тех пор этого не происходило. У меня это работает, потому что они все равно недоступны в дизайнере.
По моему опыту, это связано с изменением версии библиотеки, на которую указывает ссылка, или с изменением самой библиотеки, которая содержит тип поддержки свойства, которое вы определили в своем пользовательском элементе управления. Решение состоит в том, чтобы «заставить» дизайнера Visual Studio повторно инициализировать код своего конструктора для этого типа, а не ожидать, что он получит его «стандартную» версию из RESX-файла элемента управления.
1) Удалите секцию с ошибочными данными в RESX-файле вашего элемента управления. Это будет раздел в xml файла .resx, связанного с вашим пользовательским элементом управления, который имеет узел: - атрибут name будет установлен так, как вы назвали этот объект в свойствах того, что вы добавил этот тип в. Раздел /data> содержит строку в кодировке base64, которая представляет собой закодированную форму имени и версии библиотеки, из которой происходит тип. Вот где проблема, потому что теперь он содержит закодированную версию библиотеки и / или номер версии, на которую вы больше не ссылаетесь, чтобы включить тип. Удалите весь раздел /data> , от открывающего до закрывающего тега, сохраните изменения и закройте файл. Теперь «артефакта» больше нет.
2) Теперь найдите место в файле конструктора для вашего элемента управления, где создается экземпляр типа; это код инициализации, сгенерированный для вас Visual Studio, и это место, которое ожидает загрузить "стандартное" определение типа из строки в кодировке base64, содержащейся в файле .resx. Линия будет выглядеть примерно так:
. теперь просто замените вызов resources.GetObjec созданием нового экземпляра соответствующего типа, например:
. теперь сохраните изменения в файле, закройте его, перестройте, и теперь все должно собираться и запускаться ОК.
у меня есть довольно простая форма, которую я хочу локализовать (у меня на самом деле довольно много в этом проекте, у всех есть одна и та же проблема). Когда я устанавливаю свойство формы Localizable для true Visual Studio генерирует .resx файл с именем формы (как и следовало ожидать). Проблема, однако, в том, что он добавляет всевозможные вещи .файл resx, что ничто другое не может открыть (например, программа winres, ResEx, простой редактор resx файл, редактор resx и т. д.).
ошибка, которую я получаю:
система типов файлов ResX.Рисунок.балльная система.Чертеж, версия=4.0.0.0, культура=нейтральная, PublicKeyToken=b03f5f7f11d50a3a данные в строке 125, позиция 4 не могут быть расположены. Линия 127, позиция 5. не может быть разобран.
строка 124 до 127-это:
теперь я предполагаю, что Visual Studio добавляет Это, чтобы я мог перемещать кнопки и т. д. В зависимости от языка (мне не нужна или не нужна эта способность). Однако он выдает вышеуказанную ошибку в каждом редакторе другое чем Visual Studio.
единственные расширения, которые я установил (согласно менеджеру расширений):
- выделите все вхождения выбранного слова
- Лента Microsoft для WPF (которую я не использую в этом проекте)
менеджер надстроек не показывает надстройки.
Edit:
если я установлю это в Version=2.0.0.0 тогда все работает, как в Visual Studio, так и во всех внешних программах. Проблема в том, что если я что-то редактирую в Visual Studio, он сбросит его обратно в Version=4.0.0.0 .
Visual Studio создает правильный *.файлы resx. Проблема в том, что инструменты, которые вы пытаетесь использовать, были созданы для предыдущей версии спецификации. Вот почему ваш обходной путь работает.
пожалуйста, проверьте, нет ли новых версий или патчей для инструментов локализации, которые вы используете.
иногда в определенных случаях конструктор Windows forms аварийно завершает работу во время проверки формы с помощью *.файлы resx.
элементы управления, к которым был присоединен источник данных, зависят от этого поведения. В моем случае я получил некоторые наборы данных в качестве источника данных для сеток, комбо.
поэтому я открыл конструктор, и он не говорит мне, что не может открыть из-за проблемы с элементом управления с именем: blabla
после проверки конструктора-файла я узнал, что ничего нет неправильно с контролем, это просто *.resx файл, указывающий на неправильный источник, потому что Я рефакторингу набор данных. Так что the *.resx не обновился из-за этого рефакторинга.
Я открыл *.resx файл и просто искал идентификатор элемента управления и нашел код, закодированный Base64. удаление значения внутри блока без удаления тегов объемного звучания устранит проблему для этого элемента управления, как конструктор windows forms автоматическое обновление и чтение отсутствующего содержимого в *.файл resx.
4 ответа
3 Решение Marwie [2014-07-11 14:53:00]
Поместите MyTreeView и TypeDescriptorBase в другой проект и MyTreeView нему из своего проекта GUI, чтобы решить проблемы.
Я не уверен, почему именно проблема возникает - я думаю, это связано с тем, как процесс сериализации генерирует строку base64 для свойства DescriptorsAvailable. Может быть, кто-то еще может дать нам некоторое представление.
По моему опыту, это связано с изменением версии ссылочной библиотеки или изменением самой библиотеки, которая содержит тип поддержки свойства, который вы определили в своем пользовательском элементе управления. Решение состоит в том, чтобы "заставить" дизайнера визуальной студии повторно инициализировать его код разработчика для этого типа и не ожидать получения "консервированной" версии из файла.resx элемента управления.
1) Удалите раздел оскорбительных данных в файле.resx вашего элемента управления. Это будет раздел в xml файла.resx, связанный с вашим пользовательским элементом управления, который имеет узел: - атрибут name будет установлен на то, что вы назвали этим объектом в свойствах независимо от того, к чему вы добавили этот тип. Раздел /data> содержит строку с кодировкой base64, которая является кодированной формой имени и версии библиотеки, из которой получен тип. Здесь проблема ism, поскольку теперь она содержит кодированную версию библиотеки и/или номер версии, на которую вы больше не ссылаетесь, чтобы включить этот тип. Удалите весь раздел /data> , от открытия до закрывающего тега, сохраните изменения и закройте файл. Теперь "артефакт" исчез.
2) Теперь найдите место в файле конструктора для вашего элемента управления, где создается экземпляр типа; это код инициализации, созданный для вас визуальной студией, и это место, которое ожидает загрузки "консервированного" определения типа из кодированной base64 строки, содержащейся в файле.resx. Строка будет выглядеть примерно так:
. теперь просто замените вызов resources.GetObjec с созданием нового экземпляра соответствующего типа, например:
. теперь сохраните изменения в файле, закройте его, перестройте, и теперь все должно быть построено и работать нормально.
Для меня эта ошибка возникла, когда я использовал пользовательский класс как свойство для пользовательского элемента управления. Когда я переключился с свойств на традиционные методы get- и set-, ошибка исчезла. Я предполагаю, что это связано с тем, что свойства уже скомпилированы во время разработки, поэтому, когда вы строите весь проект, скомпилирована новая версия пользовательского класса, которая отделена от одного элемента управления, а ссылка нарушена.
Для меня, с пользовательским классом Inventory, все, что мне нужно было сделать, это перейти от этого подхода, основанного на свойствах:
Надеюсь, это поможет кому-то, поскольку я потратил несколько часов на выяснение этого.
Я немного потрудился с этим; У меня есть три пользовательских элемента управления, которые выставляют одно и то же свойство без конструктора, но по какой-то причине любое изменение на два из трех мгновенно приведет к сбою следующей сборки с этой же проблемой. Это в VS 2015.
Мне пришлось добавить следующие два атрибута в свойство, которое продолжало расширяться в файле resx, и с тех пор оно не произошло. Это работает для меня, потому что они все равно недоступны дизайнеру.
Здесь рассматривается работа с XML-файлами (RESX-файлами), содержащими ресурсы. Сведения о работе с двоичными файлами ресурсов, внедренными в сборки, см. в статье ResourceManager.
Существуют также способы работы с RESX-файлами, отличные от программных. При добавлении в проект Visual Studio файла ресурсов среда Visual Studio предоставляет интерфейс для создания и обслуживания RESX-файла и во время компиляции автоматически преобразует RESX-файл в RESOURCES-файл. Для непосредственной работы с RESX-файлом можно также использовать текстовый редактор. Однако следует соблюдать осторожность и избегать изменения содержащихся в файле двоичных данных: это может привести к его повреждению.
Читайте также: