Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приведены дополнительные сведения об ограничениях, которые применяются к компонентам среды выполнения Windows, написанным с использованием C#/WinRT. Она подробно описывает сведения, содержащиеся в сообщениях об ошибках от C#/WinRT, когда автор создает свой компонент. Для существующих управляемых компонентов UWP .NET Native метаданные для компонентов C# WinRT создаются с помощью инструмента .NET под названием Winmdexp.exe. Теперь, когда поддержка среды выполнения Windows не связана с .NET, C#/WinRT предоставляет средства для создания файла .winmd из компонента. Среда выполнения Windows имеет больше ограничений на код, чем библиотека классов C#, и Диагностический сканер C#/WinRT предупреждает о них перед созданием файла .winmd.
В этой статье рассматриваются ошибки C#/WinRT, которые возникают в вашей сборке. Она обновляет сведения об ограничениях для существующих управляемых компонентов UWP .NET Native, использующих средство Winmdexp.exe.
Выполняйте поиск текста сообщения об ошибке (опустив конкретные значения, заменяемые заполнителями) или номера сообщения. Если вам не удается найти здесь необходимую информацию, помогите нам улучшить качество документации, отправив отзыв с помощью кнопки в конце этой статьи. В отзыве добавьте сообщение об ошибке. Также вы можете сообщить об ошибке в репозитории C#/WinRT.
В этой статье сообщения об ошибках упорядочиваются по сценарию.
Реализация интерфейсов, которые не являются допустимыми интерфейсами среды выполнения Windows
Компоненты C#/WinRT не могут реализовывать определенные интерфейсы среды выполнения Windows, например, интерфейсы, представляющие асинхронные действия или операции (IAsyncAction, IAsyncActionWithProgress<TProgress>, IAsyncOperation<TResult> или IAsyncOperationWithProgress<TResult,TProgress>). Вместо этого используйте класс AsyncInfo для создания асинхронных операций в компонентах среды выполнения Windows. Примечание. Это не единственные недопустимые интерфейсы, например, класс не может реализовать System.Exception.
Номер ошибки |
Текст сообщения |
|---|---|
CsWinRT1008 |
Тип компонента среды выполнения Windows {0} не может реализовать интерфейс {1}, поскольку он не является допустимым интерфейсом среды выполнения Windows |
Ошибки, связанные с атрибутами
В среде выполнения Windows перегруженные методы могут иметь одинаковое число параметров, только если одна перегрузка определена как перегрузка по умолчанию. Используйте атрибут Windows.Foundation.Metadata.DefaultOverload (CsWinRT1015, 1016).
Если массивы используются в качестве входных или выходных данных для функций или свойств, они должны быть доступны только для чтения или только для записи (CsWinRT 1025). Вы можете использовать атрибуты System.Runtime.InteropServices.WindowsRuntime.ReadOnlyArray и System.Runtime.InteropServices.WindowsRuntime.WriteOnlyArray. Эти атрибуты используются только для параметров типа массива (CsWinRT1026), и для каждого параметра (CsWinRT1023) следует применять только один атрибут.
Не нужно применять какой-либо атрибут к параметру массива, помеченному out, поскольку предполагается, что он предназначен только для записи. Если в данном случае пометить его атрибутом "только для чтения", появится сообщение об ошибке (CsWinRT1024).
Атрибуты System.Runtime.InteropServices.InAttribute и System.Runtime.InteropServices.OutAttribute не следует использовать для параметров любого типа (CsWinRT1021,1022).
Номер ошибки |
Текст сообщения |
|---|---|
CsWinRT1015 |
В классе {2}: Несколько перегрузок с {0}-параметром {1} помечены атрибутом Windows.Foundation.Metadata.DefaultOverloadAttribute. Атрибут может применяться только к одной перегрузке метода. |
CsWinRT1016 |
В классе {2}: Для перегрузок с {0}-параметром {1} должен быть задан ровно один метод в качестве перегрузки по умолчанию с помощью атрибута Windows.Foundation.Metadata.DefaultOverloadAttribute. |
CsWinRT1021 |
У метода "{0}" есть параметр "{1}", который является массивом с атрибутом System.Runtime.InteropServices.InAttribute или System.Runtime.InteropServices.OutAttribute. В среде выполнения Windows параметры массива должны иметь значение ReadOnlyArray или WriteOnlyArray. При необходимости удалите эти атрибуты или замените их соответствующим атрибутом среда выполнения Windows. |
CsWinRT1022 |
У метода "{0}" есть параметр "{1}" с атрибутом System.Runtime.InteropServices.InAttribute или System.Runtime.InteropServices.OutAttribute. Среда выполнения Windows поддерживает пометку параметров атрибутом System.Runtime.InteropServices.InAttribute или System.Runtime.InteropServices.OutAttribute. Рекомендуется удалить System.Runtime.InteropServices.InAttribute и заменить System.Runtime.InteropServices.OutAttribute модификатором out. |
CsWinRT1023 |
У метода "{0}" есть параметр "{1}", который является массивом и одновременно содержит атрибуты ReadOnlyArray и WriteOnlyArray. В среда выполнения Windows параметры массива содержимого должны быть доступны для чтения или записи. Удалите один из атрибутов из "{1}". |
CsWinRT1024 |
У метода "{0}" есть выходной параметр "{1}", который является массивом, но содержит атрибут ReadOnlyArray. В среда выполнения Windows содержимое выходных массивов можно написать. Удалите атрибут из '{1}'. |
CsWinRT1025 |
У метода "{0}" есть параметр "{1}", являющийся массивом. В среда выполнения Windows содержимое параметров массива должно быть доступно для чтения или записи. Примените к "{1}" либо атрибут ReadOnlyArray, либо WriteOnlyArray. |
CsWinRT1026 |
У метода "{0}" есть параметр "{1}", который не является массивом и имеет либо атрибут ReadOnlyArray, либо WriteOnlyArray. Среда выполнения Windows не поддерживает пометку параметров, не являющихся массивами, атрибутом ReadOnlyArray или WriteOnlyArray." |
Ошибки пространства имен и недопустимые имена выходного файла
В среде выполнения Windows все открытые типы из файла метаданных Windows (.winmd) должны находиться в пространстве имен c одним именем файла .winmd, или во вложенных пространствах имен имени файла. Например, если проект Visual Studio называется A.B (т. е. компонент среды выполнения Windows — это файл A.B.winmd), он может содержать открытые классы A.B.Class1 и A.B.C.Class2, но не классы A.Class3 или D.Class4.
Примечание.
Эти ограничения применяются только к общедоступным типам, а не к частным типам, используемым в реализации.
В случае с классом A.Class3 можно либо переместить Class3 в другое пространство имен, либо изменить имя компонента среды выполнения Windows на A.winmd. В предыдущем примере код, вызывающий A.B.winmd, не сможет найти A.Class3.
В случае с классом D.Class4 имя файла не может одновременно содержать имя D.Class4 и классы из пространства имен A.B, поэтому изменение имени компонента среды выполнения Windows не поможет исправить проблему. Вы можете переместить класс D.Class4 в другое пространство имен или поместить его в другой компонент среды выполнения Windows.
Файловая система не различает регистр символов, поэтому не разрешается использовать пространства имен, отличающиеся лишь регистром (CsWinRT1002).
Номер ошибки |
Текст сообщения |
|---|---|
CsWinRT1001 |
Открытый тип относится к пространству имен ("{1}"), у которого нет общего префикса с другими пространствами имен ("{0}"). Все типы в файле метаданных Windows должны существовать в подпространстве имен пространства имен, подразумеваемого именем файла. |
CsWinRT1002 |
Обнаружено несколько пространств имен с именем "{0}"; имена пространств имен в среде выполнения Windows не могут отличаться только регистром. |
Экспорт типов, которые не являются допустимыми среда выполнения Windows типами
Открытый интерфейс компонента должен предоставлять только типы среды выполнения Windows. Тем не менее, .NET предоставляет сопоставления для ряда часто используемых типов, которые немного отличаются в .NET и среде выполнения Windows. Это позволяет разработчикам .NET использовать знакомые типы вместо изучения новых. Эти сопоставленные платформа .NET Framework типы можно использовать в общедоступном интерфейсе компонента. Дополнительные сведения см. в разделе Объявление типов в компонентах среды выполнения Windows, Передача типов среды выполнения Windows в управляемый код и Сопоставление типов .NET с типами среды выполнения Windows.
Многие из этих сопоставлений являются интерфейсами. Например, интерфейс IList<T> сопоставляется с интерфейсом IVector<T> в среде выполнения Windows. При использовании List<string> вместо IList<string> в качестве типа параметра C#/WinRT предоставляет список альтернативных вариантов, который включает все сопоставленные интерфейсы, реализованные типом List<T>. При использовании вложенных универсальных типов, таких как List<Dictionary<int, string>>, C#/WinRT предлагает варианты для каждого уровня вложения. Эти списки могут стать довольно длинными.
Как правило, лучший выбор — это интерфейс, ближайший к типу. Например, для int словаря<, строка лучше всего подходит для IDictionary>< int, string>.
Номер ошибки |
Текст сообщения |
|---|---|
CsWinRT1006 |
Член "{0}" имеет тип "{1}" в своей подписи. "{1}" не является допустимым типом среды выполнения Windows. Тем не менее, тип (или его универсальные параметры) реализует интерфейсы, которые являются допустимыми типам среды выполнения Windows. Попробуйте изменить тип "{1}" в подписи члена на один из следующих типов из пространства имен System. Collections. Generic: {2}. |
В среде выполнения Windows массивы в подписях членов должны быть одномерными с нижней границей, равной 0 (нулю). Невозможно использовать вложенные типы массивов, например, myArray[][] (CsWinRT1017) и myArray[,] (CsWinRT1018).
Примечание.
Это ограничение не применяется к массивам, которые используются во внутренней реализации.
Номер ошибки |
Текст сообщения |
|---|---|
CsWinRT1017 |
Сигнатура метода {0} содержит вложенный массив типа {1}. Массивы в подписях методов среды выполнения Windows не могут быть вложенными. |
CsWinRT1018 |
Сигнатура метода {0} содержит многомерный массив типа "{1}". Массивы в сигнатурах метода среда выполнения Windows должны быть одномерными. |
Структуры, содержащие поля запрещенных типов
В среде выполнения Windows структура может содержать только поля, и только структуры могут содержать поля. Эти поля должны быть общедоступными. Допустимые типы полей включают перечисления, структуры и примитивные типы.
Номер ошибки |
Текст сообщения |
|---|---|
CsWinRT1007 |
Структура {0} не содержит открытых полей. Структуры среды выполнения Windows должны содержать не менее одного открытого поля. |
CsWinRT1011 |
Структура {0} имеет не открытое поле. Все поля должны быть открытыми для структур среды выполнения Windows. |
CsWinRT1012 |
Структура {0} имеет поле константы. Константы могут использоваться только в перечислениях среды выполнения Windows. |
CsWinRT1013 |
У структуры {0} есть поле типа {1}; {1}не является допустимым типом поля среды выполнения Windows. Каждое поле в структуре среда выполнения Windows может быть только UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Boolean, String, Enum или сама структура. |
Имя параметра конфликтует с созданным кодом
В среде выполнения Windows возвращаемые значения считаются выходными параметрами, а имена параметров должны быть уникальными. По умолчанию C#/WinRT присваивает возвращаемому значению имя __retval. Если у метода есть параметр с именем __retval, возникнет ошибка CsWinRT1010. Чтобы исправить ее, присвойте параметру имя, которое отличается от __retvalue.
Номер ошибки |
Текст сообщения |
|---|---|
CsWinRT1010 |
Имя параметра {1} в методе {0} совпадает с именем параметра возвращаемого значения, используемого в созданном взаимодействии C#/WinRT; используйте другое имя параметра. |
Разное
Другие ограничения создаваемого компонента C#/WinRT:
- Вы не можете предоставлять перегруженные операторы открытых типах.
- Классы и интерфейсы не могут быть универсальными.
- Классы должны быть запечатаны.
- Параметры невозможно передавать по ссылке, например, используя ключевое слово ref.
- Свойства должны иметь открытый метод get.
- В пространстве имен компонента должен быть хотя бы один открытый тип (класс или интерфейс).
Номер ошибки |
Текст сообщения |
|---|---|
CsWinRT1014 |
"{0}" является перегрузкой оператора. Управляемые типы не могут предоставлять перегрузки операторов в среда выполнения Windows. |
CsWinRT1004 |
Тип {0} является универсальным. Типы среды выполнения Windows не могут быть универсальными. |
CsWinRT1005 |
CsWinRT не поддерживает экспорт незапечатанных типов. Пометьте тип {0} как запечатанный. |
CsWinRT1020 |
Метод "{0}" имеет параметр "{1}" с отметкой "ref". Параметры ссылки в среда выполнения Windows не поддерживаются. |
CsWinRT1000 |
Свойство "{0}" не имеет открытого метода получения. Среда выполнения Windows не поддерживает свойства только метода задания. |
CsWinRT1003 |
Компоненты среды выполнения Windows должны иметь не менее одного открытого типа |
В среда выполнения Windows класс может иметь только один конструктор с заданным числом параметров. Например, не получится использовать один конструктор с одним параметром типа string и другой конструктор с одним параметром типа int. Единственное решение — использовать разное число параметров для каждого конструктора.
Номер ошибки |
Текст сообщения |
|---|---|
CsWinRT1009 |
Классы не могут иметь несколько конструкторов одинаковой арности в среде выполнения Windows, у класса {0} есть несколько {1}-арных конструкторов. |
Windows developer