Visual Studio всегда выбирает неправильный xsd для App.config - PullRequest
22 голосов
/ 04 декабря 2010

Прежде всего, у меня есть приложение .NET 4.0 с такой конфигурацией:

<?xml version="1.0"?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
</configuration>

У меня возникла та же проблема, что и в этом вопросе: app.config "Не удалось найти информацию о схеме" после преобразования в Visual Studio 2010 / .Net 4.0 : элемент supportRuntime не был распознан редактор, в результате чего подсказка.

Затем я последовал ответу: я был в редакторе app.config и зашел в окно «Свойства». Там я выбрал запись схемы.

Я удалил выбор DotNetConfig.xsd и выбрал DotNetConfig35.xsd вместо этого, но VS всегда автоматически добавляет DotNetConfig.xsd снова. Даже если я явно укажу «не использовать эту схему» или даже удалю схему из списка - она ​​автоматически добавится в список и снова будет выбрана.

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

Как я могу изменить схему, чтобы использовать DotNetConfig35.xsd и НЕ иметь автоматического добавления DotNetConfig.xsd снова?

Ответы [ 3 ]

41 голосов
/ 09 декабря 2010

Я интерпретирую проблему следующим образом: файл DotNetConfig.xsd имеет неправильное (или не полное) определение элемента <startup>. Строка 230 всех файлов DotNetConfig.xsd, DotNetConfig35.xsd, DotNetConfig30.xsd и DotNetConfig20.xsd содержит

<xs:element name="startup" vs:help="configuration/startup" />

С другой стороны, Microsoft описывает схему настроек запуска не как пустой элемент. Поэтому я предлагаю заменить вышеуказанную строку в DotNetConfig.xsd и во всех DotNetConfigXX.xsd файлах из каталога %ProgramFiles%\Microsoft Visual Studio 10.0\Xml\Schemas (или каталога %ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Xml\Schemas в 64-разрядных системах) на следующие строки

<xs:element name="startup" vs:help="configuration/startup">
    <xs:complexType>
        <xs:choice minOccurs="1" maxOccurs="1">
            <xs:element name="requiredRuntime" vs:help="configuration/startup/requiredRuntime">
                <xs:complexType>
                    <xs:attribute name="version" type="xs:string" use="optional" />
                    <xs:attribute name="safemode" type="xs:boolean" use="optional" />
                </xs:complexType>
            </xs:element>
            <xs:element name="supportedRuntime" minOccurs="1" maxOccurs="unbounded" vs:help="configuration/startup/supportedRuntime">
                <xs:complexType>
                    <xs:attribute name="version" type="xs:string" use="optional" />
                    <xs:attribute name="sku" type="xs:string" use="optional" />
                </xs:complexType>
            </xs:element>
        </xs:choice>
        <xs:attribute name="useLegacyV2RuntimeActivationPolicy" type="xs:boolean" use="optional" />
        <!-- see http://msdn.microsoft.com/en-us/library/bbx34a2h.aspx -->
    </xs:complexType>
</xs:element>

После такой модификации и перезапуска Visual Studio 2010 у вас не будет предупреждений, которые вы описали. Конечно, можно определить схему всех атрибутов или элементов более подробно (особенно если мы найдем более подробную документацию по разделу <startup>), но я хочу описать только причину проблемы и один способ ее устранения.

Кстати, выбор между DotNetConfig.xsd, DotNetConfig35.xsd и другими DotNetConfigXX.xsd файлами будет сделан на основе содержимого файла catalog.xml из того же каталога, схема которого описана здесь, Стандартная версия файла catalog.xml содержит следующие строки

<Association extension="config" schema="%InstallRoot%/xml/schemas/dotNetConfig20.xsd" condition="starts-with($TargetFrameworkMoniker, '.NETFramework,Version=v2.')" />
<Association extension="config" schema="%InstallRoot%/xml/schemas/dotNetConfig30.xsd" condition="starts-with($TargetFrameworkMoniker, '.NETFramework,Version=v3.0')" />
<Association extension="config" schema="%InstallRoot%/xml/schemas/dotNetConfig35.xsd" condition="starts-with($TargetFrameworkMoniker, '.NETFramework,Version=v3.5')" />
<Association extension="config" schema="%InstallRoot%/xml/schemas/dotNetConfig.xsd"   condition="starts-with($TargetFrameworkMoniker, '.NETFramework,Version=v4.') or $TargetFrameworkMoniker = ''" />

Таким образом, все файлы с расширением .config будут интерпретироваться Visual Studio как файлы со схемой XSD, описанной одним из вышеуказанных файлов.

1 голос
/ 21 апреля 2016

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

(VS2015 у меня был открыт с одним проектом, а VS2013 также был открыт одновременно с другим проектом.)

Обратите внимание, что несколько версий Visual Studio и переключение туда и обратно в одном и том же проекте / решении также, по-видимому, вызвали некоторые проблемы с повторяющимися схемами.

0 голосов
/ 11 января 2016

Это старый пост, но я только что столкнулся с той же проблемой.

Я выбрал тот же подход, который предложил Кен Джонсруд для создания нового файла .xsd:

http://w3stack.org/question/c-how-to-fix-error-could-not-find-schema-information-for-the-attributeelement-by-creating-schema/

  1. MSVS> Открыть проект app.config

  2. XML> Создать схему

    Это создаст "приложение".xsd "в% TEMP%

     EXAMPLE: c:\users\paulsm\AppData\Local\Temp\app.xsd
    
  3. Переместить app.xsd в каталог проекта

  4. App.Config, щелкните правой кнопкой мыши> Свойства>Схемы> ... app.xsd> Использование> Использовать эту схему = ДА

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