Diagnóstico de errores de componentes de C#/WinRT
En este artículo se proporciona información adicional acerca de las restricciones en componentes de Windows Runtime escritos con C#/WinRT. Aquí se amplía la información que se proporciona en los mensajes de error de C#/WinRT cuando un autor crea su componente. Para los componentes administrados nativos de UWP .NET existentes, los metadatos para los componentes de C#/WinRT se generan mediante Winmdexp.exe, una herramienta de .NET. Ahora que el soporte técnico de Windows Runtime está desacoplado de .NET, C#/WinRT proporciona las herramientas para generar un archivo .winmd desde el componente. Windows Runtime tiene más restricciones de código que una biblioteca de clases de C#, y las alertas del escáner de diagnóstico de C#/WinRT le advierten de estas antes de generar un archivo .winmd.
En este artículo se tratan los errores notificados en la compilación desde C#/WinRT. Este artículo sirve como una versión actualizada de la información sobre restricciones para componentes administrados nativos de UWP .NET que usan la herramienta Winmdexp.exe.
Busque el texto del mensaje de error (omitiendo valores específicos de marcadores de posición) o el número de mensaje. Si no encuentra la información que necesita aquí, ayúdenos a mejorar la documentación con el botón de comentarios al final de este artículo. En sus comentarios, incluya el mensaje de error. Como alternativa, puede presentar un error en el repositorio de C#/WinRT.
En este artículo se organizan los mensajes de error por escenario.
Implementación de interfaces que no son válidas en Windows Runtime
Los componentes de C#/WinRT no pueden implementar ciertas interfaces de Windows Runtime, como las interfaces de Windows Runtime que representan acciones u operaciones asincrónicas (IAsyncAction, IAsyncActionWithProgress<TProgress>, IAsyncOperation<TResult> o IAsyncOperationWithProgress<TResult, TProgress>). En su lugar, utilice la clase AsyncInfo para generar operaciones asíncronas en componentes de Windows Runtime. Nota: Estas no son las únicas interfaces que no son válidas; por ejemplo, una clase no puede implementar System.Exception.
Número de error |
Texto del mensaje |
---|---|
CsWinRT1008 |
El tipo de componente de Windows Runtime {0} no puede implementar la interfaz {1}, ya que esta interfaz no es una interfaz válida de Windows Runtime. |
Errores relacionados con atributos
En Windows Runtime, los métodos sobrecargados pueden tener el mismo número de parámetros solo si se especifica una sobrecarga como sobrecarga predeterminada. Use el atributo Windows.Foundation.Metadata.DefaultOverload (CsWinRT1015, 1016).
Cuando las matrices se usan como entradas o salidas en funciones o propiedades, deben ser de solo lectura o de solo escritura (CsWinRT 1025). Los atributos System.Runtime.InteropServices.WindowsRuntime.ReadOnlyArray y System.Runtime.InteropServices.WindowsRuntime.WriteOnlyArray se proporcionan para su uso. Los atributos proporcionados solo se usan en parámetros del tipo de matriz (CsWinRT1026) y solo se debe aplicar uno por parámetro (CsWinRT1023).
No es necesario aplicar ningún atributo a un parámetro de matriz marcado como out, ya que se supone que es de solo escritura. Hay un mensaje de error si lo detalla como de solo lectura en este caso (CsWinRT1024).
Los atributos System.Runtime.InteropServices.InAttribute y System.Runtime.InteropServices.OutAttribute no deben usarse en parámetros de ningún tipo (CsWinRT1021,1022).
Número de error |
Texto del mensaje |
---|---|
CsWinRT1015 |
En la clase {2}: se representan varias sobrecargas del parámetro {0} de "{1}" con Windows.Foundation.Metadata.DefaultOverloadAttribute. El atributo solo se puede aplicar a una sobrecarga del método. |
CsWinRT1016 |
En la clase {2}: las sobrecargas del parámetro {0} de {1} deben tener exactamente un método especificado como la sobrecarga predeterminada al representarla con Windows.Foundation.Metadata.DefaultOverloadAttribute. |
CsWinRT1021 |
El método "{0}" tiene el parámetro "{1}", que es una matriz, y que tiene un System.Runtime.InteropServices.InAttribute o un System.Runtime.InteropServices.OutAttribute. En Windows Runtime, los parámetros de matriz deben tener ReadOnlyArray o WriteOnlyArray. Quita estos atributos o reemplázalos con el atributo de Windows Runtime apropiado si es necesario. |
CsWinRT1022 |
El método "{0}" tiene el parámetro "{1}" con System.Runtime.InteropServices.InAttribute o System.Runtime.InteropServices.OutAttribute.Windows Runtime, que no admite el marcado de parámetros con System.Runtime.InteropServices.InAttribute o System.Runtime .InteropServices.OutAttribute. Por favor, considera la posibilidad de quitar System.Runtime.InteropServices.InAttribute y reemplaza System.Runtime.InteropServices.OutAttribute por el modificador 'out' en su lugar. |
CsWinRT1023 |
El método "{0}" tiene el parámetro "{1}" que es una matriz y que tiene tanto ReadOnlyArray como WriteOnlyArray. En Windows Runtime, los parámetros de la matriz de contenido deben ser o bien de lectura o bien de escritura. Quita uno de los atributos de '{1}'. |
CsWinRT1024 |
El método "{0}" tiene un parámetro de salida "{1}" que es una matriz, pero que tiene el atributo ReadOnlyArray. En Windows Runtime, el contenido de las matrices de salida es modificable. Quita el atributo de '{1}'. |
CsWinRT1025 |
El método "{0}" tiene el parámetro "{1}" que es una matriz. En Windows Runtime, el contenido de los parámetros de la matriz debe ser o bien de lectura o bien de escritura. Aplique ReadOnlyArray o WriteOnlyArray a "{1}". |
CsWinRT1026 |
El método "{0}" tiene el parámetro "{1}" que no es una matriz y que tiene un atributo ReadOnlyArray o un atributo WriteOnlyArray. Windows Runtime no admite marcar parámetros que no sean de matriz con ReadOnlyArray o WriteOnlyArray. |
Errores de espacio de nombres y nombres inválidos para el archivo de salida
En Windows Runtime, todos los tipos públicos de un archivo de metadatos de Windows (.winmd) deben estar en un espacio de nombres que comparta el nombre de archivo .winmd, o en subespacios de nombres del nombre de archivo. Por ejemplo, si el proyecto de Visual Studio se denomina A.B (es decir, el componente de Windows Runtime es A.B.winmd), puede contener las clases públicas A.B.Class1 y A.B.C.Class2, pero no la clase A.Class3 o D.Class4.
Nota
Estas restricciones solo se aplican a los tipos públicos, no a los tipos privados utilizados en su implementación.
En el caso de A.Class3, puede o bien mover Class3 a otro espacio de nombres o bien cambiar el nombre del componente de Windows Runtime por A.winmd. En el ejemplo anterior, el código que llama a A.B.winmd no podrá encontrar A.Class3.
En el caso de D.Class4, ningún nombre de archivo puede contener tanto D.Class4 como las clases en el espacio de nombres A.B, por lo que cambiar el nombre del componente de Windows Runtime no es una opción. Puede mover D.Class4 a otro espacio de nombres o incluirlo en otro componente de Windows Runtime.
El sistema de archivos no distingue entre mayúsculas y minúsculas, por lo que los espacios de nombres que varían según el caso no están permitidos (CsWinRT1002).
Número de error |
Texto del mensaje |
---|---|
CsWinRT1001 |
Un tipo público tiene un espacio de nombres ("{1}") que no comparte un prefijo común con otros espacios de nombres ("{0}"). Todos los tipos dentro de un archivo de metadatos de Windows deben existir en un subespacio de nombres del espacio de nombres que se determina según el nombre de archivo. |
CsWinRT1002 |
Se encontraron varios espacios de nombres con el nombre "{0}"; los nombres de espacio de nombres no pueden diferir solo por mayúsculas y minúsculas en Windows Runtime. |
Exportar tipos que no son tipos válidos de Windows en tiempo de ejecución
La interfaz pública del componente debe exponer solo los tipos de Windows Runtime. Sin embargo, .NET proporciona asignaciones para una serie de tipos de uso frecuente que son ligeramente diferentes en .NET y Windows Runtime. Esto permite al desarrollador de .NET trabajar con tipos familiares en lugar de aprender nuevos. Puedes usar estos tipos de .NET Framework asignados en la interfaz pública de tu componente. Para obtener más información, consulte Declaración de tipos en componentes de Windows Runtime, Paso de tipos de Windows Runtime a código administrado y Asignaciones .NET de tipos de Windows Runtime.
Muchas de estas asignaciones son interfaces. Por ejemplo, IList<T> se asigna al elemento IVector<T> de la interfaz de Windows Runtime. Si usa List<string> en lugar de IList<string> como tipo de parámetro, C#/WinRT proporciona una lista de alternativas que incluye todas las interfaces asignadas e implementadas por List<T>. Si usa tipos genéricos anidados, como List<Dictionary<int, string>>, C#/WinRT le ofrece opciones para cada nivel de anidación. Estas listas pueden ser bastante largas.
En general, la mejor opción es la interfaz que más se asemeje al tipo. Por ejemplo, para Dictionary<int, string>, la mejor opción es probablemente IDictionary<int, string>.
Número de error |
Texto del mensaje |
---|---|
CsWinRT1006 |
El miembro "{0}" tiene el tipo "{1}" en su firma. El tipo "{1}" no es un tipo válido de Windows Runtime. Sin embargo, el tipo (o sus parámetros genéricos) implementan interfaces que son válidas en Windows Runtime. Considere la posibilidad de cambiar el tipo "{1}" en la firma de miembro a uno de los siguientes tipos de System.Collections.Generic: {2}. |
En Windows Runtime, las matrices en las signaturas de miembros deben ser unidimensionales con un límite inferior de 0 (cero). Los tipos de matrices anidadas como myArray[][]
(CsWinRT1017) y myArray[,]
(CsWinRT1018) no están permitidos.
Nota
Esta restricción no se aplica a las matrices que utilices internamente en tu implementación.
Número de error |
Texto del mensaje |
---|---|
CsWinRT1017 |
El método {0} tiene una matriz anidada de tipo {1} en su firma. Las matrices de firmas de método de Windows Runtime no pueden anidarse. |
CsWinRT1018 |
El método {0} tiene una matriz multidimensional de tipo {1} en su firma. Las matrices de firmas de método de Windows Runtime deben ser unidimensionales. |
Estructuras que contienen campos de tipos no autorizados
En Windows Runtime una estructura puede contener solo campos, y solo las estructuras pueden contener campos. Estos campos deben ser públicos. Los tipos de campos válidos incluyen tipos primitivos, estructuras y enumeraciones.
Número de error |
Texto del mensaje |
---|---|
CsWinRT1007 |
La estructura {0} no contiene campos públicos. Las estructuras de Windows Runtime deben contener al menos un campo público. |
CsWinRT1011 |
La estructura {0} no contiene campos públicos. Todos los campos deben ser públicos para las estructuras de Windows Runtime. |
CsWinRT1012 |
La estructura {0} contiene campos constantes. Las constantes solo pueden aparecer en las enumeraciones de Windows Runtime. |
CsWinRT1013 |
La estructura {0} tiene un campo de tipo {1}; {1} no es un tipo de campo de Windows Runtime válido. Cada campo en una estructura de Windows Runtime solo puede ser UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Boolean, String, Enum o una estructura en sí mismo. |
El nombre de parámetro entra en conflicto con el código generado.
En Windows Runtime, los valores devueltos se considera que son parámetros de salida y los nombres de los parámetros deben ser únicos. De forma predeterminada, C#/WinRT proporciona al valor devuelto el nombre __retval
. Si su método tiene un parámetro denominado __retval
, obtendrá el error CsWinRT1010. Para corregirlo, asigne al parámetro un nombre distinto de __retvalue
.
Número de error |
Texto del mensaje |
---|---|
CsWinRT1010 |
El nombre del parámetro {1} en el método {0} es el mismo que el nombre del parámetro de valor devuelto que se ha usado en la interoperabilidad generada de C#/WinRT; use un nombre de parámetro diferente. |
Varios
Otras restricciones de un componente de creación de C#/WinRT incluyen:
- No se pueden exponer operadores sobrecargados en tipos públicos.
- Las clases e interfaces no pueden ser genéricas.
- Las clases deben estar selladas.
- Los parámetros no se pueden pasar por referencias; por ejemplo, mediante la palabra clave ref.
- Las propiedades deben tener un método "get" público.
- Debe haber al menos un tipo público (clase o interfaz) en el espacio de nombres del componente.
Número de error |
Texto del mensaje |
---|---|
CsWinRT1014 |
"{0}" es una sobrecarga del operador. Los tipos administrados no pueden exponer sobrecargas de operadores en Windows Runtime. |
CsWinRT1004 |
El tipo {0} es genérico. Los tipos de Windows Runtime no pueden ser genéricos. |
CsWinRT1005 |
CsWinRT no admite la exportación de tipos sin sellar. Marque el tipo {0} como sellado. |
CsWinRT1020 |
El método "{0}" tiene el parámetro "{1}" marcado como `ref`. Los parámetros de referencia no se permiten en Windows Runtime. |
CsWinRT1000 |
La propiedad "{0}" no tiene un método "getter" público. Windows Runtime no admite propiedades solo de establecimiento. |
CsWinRT1003 |
Los componentes de Windows Runtime deben tener al menos un tipo público. |
En Windows Runtime, una clase solo puede tener un constructor con un número determinado de parámetros. Por ejemplo, no puede tener un constructor que tenga un solo parámetro de tipo string y otro constructor que tenga un solo parámetro de tipo int. La única solución es utilizar un número diferente de parámetros para cada constructor.
Número de error |
Texto del mensaje |
---|---|
CsWinRT1009 |
Las clases no pueden tener varios constructores de tipo "arity" en Windows Runtime, pero la clase {0} tiene varios constructores {1} -arity. |