Diagnosticando condições de erro do componente Tempo de Execução do Windows
Este artigo fornece informações adicionais sobre limitações em componentes do Tempo de Execução do Windows escritos em código gerenciado. Ele amplia as informações fornecidas em mensagens de erro do Winmdexp.exe (Ferramenta de Exportação de Metadados do Tempo de Execução do Windows) e complementa as informações sobre limitações fornecidas em Criando componentes do Tempo de Execução do Windows em C# e Visual Basic.
Este artigo não aborda todos os erros. Os erros discutidos aqui são agrupados por categoria geral, e cada categoria inclui uma tabela de mensagens de erro associadas. Pesquise pelo texto da mensagem (omitindo valores específicos de espaços reservados) ou pelo número da mensagem. Se você não localizar as informações necessárias aqui, ajude-nos a melhorar a documentação usando o botão de comentários no final deste artigo. inclua a mensagem de erro. Como alternativa, você pode registrar um erro no Site do Microsoft Connect.
Este artigo contém as seguintes seções:
Durante a implementação do padrão assíncrono, uma mensagem de erro fornece o tipo incorreto
Referências ausentes a mscorlib.dll e/ou a System.Runtime.dll
A sobrecarga de operador não é permitida
Os construtores em uma classe têm o mesmo número de parâmetros
É necessário especificar um padrão para as sobrecargas que têm o mesmo número de parâmetros
Erros de namespace e nomes inválidos para o arquivo de saída
Exportando tipos que não são tipos válidos do Tempo de Execução do Windows
Estruturas que contêm campos de tipos não permitidos
Restrições em matrizes em assinaturas de membros
Os parâmetros da matriz devem especificar se o conteúdo da matriz é de leitura ou de gravação
Membro com um parâmetro denominado “valor”
A mensagem de erro pela implementação de uma interface assíncrona fornece o tipo incorreto
Componentes do Tempo de Execução do Windows gerenciados não podem implementar as interfaces do Tempo de Execução do Windows que representam ações ou operações assíncronas (IAsyncAction, IAsyncActionWithProgress<TProgress>, IAsyncOperation<TResult> ou IAsyncOperationWithProgress<TResult, TProgress>). Em vez disso, o .NET Framework fornece a classe AsyncInfo para gerar operações assíncronas em componentes do Tempo de Execução do Windows. A mensagem de erro que o Winmdexp.exe exibe quando você tenta implementar incorretamente uma interface assíncrona refere-se a essa classe pelo seu nome antigo, AsyncInfoFactory. O .NET Framework não inclui a classe AsyncInfoFactory.
Número do erro |
Texto da mensagem |
---|---|
WME1084 |
O tipo “{0}” implementa a interface assíncrona do Tempo de Execução do Windows “{1}”. Os tipos do Tempo de Execução do Windows não podem implementar interfaces assíncronas. Use a classe System.Runtime.InteropServices.WindowsRuntime.AsyncInfoFactory para gerar operações assíncronas para exportação ao Tempo de Execução do Windows. |
Referências ausentes a mscorlib.dll ou a System.Runtime.dll
Esse problema ocorre somente quando você usa Winmdexp.exe na linha de comando. É recomendável que você use a opção /reference para incluir referências ao mscorlib.dll e ao System.Runtime.dll dos assemblies de referência principal do .NET Framework, localizados em "%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5" ("%ProgramFiles%\..." em um computador de 32 bits).
Número do erro |
Texto da mensagem |
---|---|
WME1009 |
Nenhuma referência foi feita para mscorlib.dll. Uma referência a esse arquivo de metadados é necessária para exportar corretamente. |
WME1090 |
Não foi possível determinar o assembly de referência principal. Verifique se o mscorlib.dll e System.Runtime.dll são referenciados usando a opção /reference. |
A sobrecarga de operador não é permitida
Em um componente do Tempo de Execução do Windows gravado em código gerenciado, você não pode expor operadores sobrecarregados em tipos públicos.
Dica
N mensagem de erro, o operador é identificado pelo seu nome de metadados, como op_Addition, op_Multiply, op_ExclusiveOr, op_Implicit (conversão implícita), etc.
Número do erro |
Texto da mensagem |
---|---|
WME1087 |
“{0}” é uma sobrecarga de operador. Os tipos gerenciados não podem expor sobrecargas de operador no Tempo de Execução do Windows. |
Os construtores em uma classe têm o mesmo número de parâmetros
No Tempo de Execução do Windows, uma classe pode ter apenas um construtor com um determinado número de parâmetros; por exemplo, você não pode ter um construtor que tenha um único parâmetro do tipo String e outro que tenha um único parâmetro do tipo int (Integer no Visual Basic). A única solução alternativa é usar um número diferente de parâmetros para cada construtor.
Número do erro |
Texto da mensagem |
---|---|
WME1099 |
O tipo '{0}' tem vários construtores com '{1}' argumentos. Os tipos do Tempo de Execução do Windows não podem ter vários construtores com o mesmo número de argumentos. |
É necessário especificar um padrão para as sobrecargas que têm o mesmo número de parâmetros
No Tempo de Execução do Windows, os métodos sobrecarregados podem ter o mesmo número de parâmetros somente se uma sobrecarga é especificada como a sobrecarga padrão. Consulte “Métodos sobrecarregados” em Criando componentes do Tempo de Execução do Windows em C# e Visual Basic.
Número do erro |
Texto da mensagem |
---|---|
WME1059 |
Sobrecargas de vários parâmetros {0} "de “{1}. {2}” são decorados com Windows.Foundation.Metadata.DefaultOverloadAttribute. |
WME1085 |
As sobrecargas de parâmetros {0} de {1}. {2} deve ter exatamente um método especificado como a sobrecarga padrão adornando-o com Windows.Foundation.Metadata.DefaultOverloadAttribute. |
Erros de namespace e nomes inválidos para o arquivo de saída
No Tempo de Execução do Windows, todos os tipos públicos em um arquivo de metadados do Windows (.winmd) devem estar um namespace que compartilhe o nome de arquivo .winmd, ou em subnamespaces do nome de arquivo. Por exemplo, se seu projeto Visual Studio 2012 for chamado de A.B (isto é, o componente do Tempo de Execução do Windows for A.B.winmd), ele poderá conter as classes públicas A.B.Class1 e A.B.C.Class2, mas não a A.Class3 (WME0006) nem a D.Class4 (WME1044).
Dica
Essas limitações se aplicam somente aos tipos públicos, não aos tipos privados usados em sua implementação.
No caso da. Class3, você pode mover a Class3 para outro namespace ou alterar o nome do componente do Tempo de Execução do Windows para A.winmd. Embora WME0006 seja um aviso, você deve tratá-lo como um erro. No exemplo anterior, o código que chama A.B.winmd poderá localizar a A.Class3.
No caso da D.Class4, nenhum nome de arquivo pode conter D.Class4 e classes no namespace A.B portanto, alterar o nome do componente do Tempo de Execução do Windows não é uma opção. Você pode mover a D.Class4 para outro namespace ou colocá-la em outro componente do Tempo de Execução do Windows.
O sistema de arquivos não pode distinguir entre maiúsculas e minúsculas, então, namespaces que se diferem pelo tamanho da letra não são permitidos (WME1067).
O componente deve conter pelo menos um tipo public sealed (Public NotInheritable no Visual Basic). Caso contrário, você terá WME1042 ou WME1043, dependendo se o seu componente contém tipos privados.
Um tipo em um componente do Tempo de Execução do Windows não pode ter o mesmo nome de um namespace (WME1068).
Aviso
Se você chamar o Winmdexp.exe diretamente e não usar a opção /out para especificar um nome para o seu componente do Tempo de Execução do Windows, o Winmdexp.exe tentará gerar um nome que inclua todos os namespaces no componente. Renomear namespaces pode alterar o nome do seu componente.
Número do erro |
Texto da mensagem |
---|---|
WME0006 |
"{0}" não é um nome de arquivo winmd válido para esse assembly. Todos os tipos em um arquivo de metadados do Windows devem existir em um namespace secundário do namespace indicado pelo nome do arquivo. Tipos que não existe em um namespace secundário não podem ser localizados no tempo de execução. Nesse assembly, o menor namespace comum que pode servir como um nome de arquivo é “{1}”. |
WME1042 |
O módulo de entrada deve conter pelo menos um tipo público localizado em um namespace. |
WME1043 |
O módulo de entrada deve conter pelo menos um tipo público localizado em um namespace. Os únicos tipos encontrados em namespaces são privados. |
WME1044 |
Um tipo público tem um namespace (“{1}") que não compartilha nenhum prefixo comum com outros namespaces (“{0}"). Todos os tipos em um arquivo de metadados do Windows devem existir em um namespace secundário do namespace indicado pelo nome do arquivo. |
WME1067 |
Os nomes de namespaces não podem diferir somente por letras maiúsculas e minúsculas: '{0}', '{1}'. |
WME1068 |
O tipo “{0}” não pode ter o mesmo nome do namespace “{1}”. |
Exportando tipos que não são tipos válidos do Tempo de Execução do Windows
A interface pública do seu componente deve expor somente tipos do Tempo de Execução do Windows. No entanto, o .NET Framework fornece mapeamentos para uma variedade de tipos de uso geral que são um pouco diferentes no .NET Framework e no Tempo de Execução do Windows. Isso permite que o desenvolvedor .NET Framework trabalhe com tipos familiares em vez de aprender novos tipos. Você pode usar esses tipos do .NET Framework mapeados na interface pública do seu componente. Consulte “Declarando tipos em componentes do Tempo de Execução do Windows ” e “Transmitindo tipos do Tempo de Execução do Windows para código gerenciado” em Criando componentes do Tempo de Execução do Windows em C# e Visual Basic e Mapeamentos do .NET Framework de tipos do Tempo de Execução do Windows.
Muitos desses mapeamentos são interfaces. Por exemplo, IList<T> mapeia para a interface do Tempo de Execução do Windows IVector<T>. Se você usar List<string> (List(Of String) no Visual Basic) em vez de IList<string> como um tipo de parâmetro, o Winmdexp.exe fornecerá uma lista de alternativas que inclui todas as interfaces mapeadas implementadas por List<T>. Se você usar tipos genéricos aninhados, como List<Dictionary<int, string>> (List(Of Dictionary(Of Integer, String)) no Visual Basic), o Winmdexp.exe oferecerá opções para cada nível de aninhamento. Essas listas podem se tornar muito longas.
Em geral, a melhor opção é a interface mais próxima do tipo. Por exemplo, para Dictionary<int, string>, provavelmente, a melhor opção é IDictionary<int, string>.
Importante
O JavaScript usa a interface que aparece primeiro na lista de interfaces implementadas por um tipo gerenciado. Por exemplo, se você retornarDictionary<int, string> para o código JavaScript, ele aparecerá como IDictionary<int, string>, não importando qual interface você especificar como o tipo de retorno. Isso significa que se a primeira interface não incluir um membro que apareça nas interfaces posteriores, esse membro não será visível para JavaScript.
Aviso
Evite usar interfaces IList e IEnumerable não genéricas se o seu componente for usado por JavaScript. Essas interfaces mapeiam para IBindableVector e IBindableIterator, respectivamente. Elas oferecem suporte à associação para controles XAML, e são visíveis para JavaScript. O JavaScript emite o erro em tempo de execução “A função “X” tem uma assinatura inválida e não pode ser chamada.”
Número do erro |
Texto da mensagem |
---|---|
WME1033 |
O método “{0}” tem o parâmetro “{1}” do tipo “{2}”. '{2}' não é um tipo de parâmetro válido do Tempo de Execução do Windows. |
WME1038 |
O método “{0}” tem um parâmetro de tipo “{1}” na sua assinatura. Embora esse tipo não seja um tipo válido do Tempo de Execução do Windows, ele implementa as interfaces que são tipos válidos do Tempo de Execução do Windows. Considere alterar a assinatura do método para usar um dos seguintes tipos: “{2}”. |
WME1039 |
O método “{0}” tem um parâmetro de tipo “{1}” na sua assinatura. Embora esse tipo genérico não seja um tipo válido do Tempo de Execução do Windows, o tipo ou seus parâmetros genéricos implementam interfaces que são tipos válidos do Tempo de Execução do Windows. {2}
Observação
Para {2}, o Winmdexp.exe acrescenta uma lista de alternativas, como “Considere alterar o tipo “System.Collections.Generic.List<T>” na assinatura de método a um dos seguintes tipos: 'System.Collections.Generic.IList<T>, System.Collections.Generic.IReadOnlyList<T>, System.Collections.Generic.IEnumerable<T>'."
|
WME1040 |
O método “{0}” tem um parâmetro de tipo “{1}” na sua assinatura. Em vez de usar um tipo gerenciado de tarefa gerenciado, use Windows.Foundation.IAsyncAction, Windows.Foundation.IAsyncOperation ou uma das interfaces assíncronas do Tempo de Execução do Windows. O padrão de espera do .NET padrão também se aplica a essas interfaces. Consulte System.Runtime.InteropServices.WindowsRuntime.AsyncInfo para obter mais informações sobre como converter objetos de tarefa gerenciados em interfaces assíncronas do Tempo de Execução do Windows. |
Estruturas que contêm campos de tipos não permitidos
No Tempo de Execução do Windows, uma estrutura pode conter somente campos, e somente as estruturas podem conter campos. Esses campos devem ser públicos. Os tipos de campo válidos incluem enumerações, estruturas e tipos primitivos.
Número do erro |
Texto da mensagem |
---|---|
WME1060 |
A estrutura “{0}” tem o campo “{1}” do tipo “{2}”. '{2}' não é um tipo de campo válido do Tempo de Execução do Windows. Cada campo em uma estrutura do Tempo de Execução do Windows só pode ser UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Único, Duplo, Booliano, Cadeia de Caracteres, Enumeração ou a própria estrutura. |
Restrições em matrizes em assinaturas de membros
No Tempo de Execução do Windows, matrizes em assinaturas de membros devem ser unidimensionais com uma associação inferior de zero (0). Tipos de matriz aninhados como myArray[][] (myArray()() no Visual Basic) não são permitidos.
Dica
Essa limitação não se aplica a matrizes que você usa internamente em sua implementação.
Número do erro |
Texto da mensagem |
---|---|
WME1034 |
O método “{0}” tem uma matriz do tipo “{1}” com associação inferior diferente de zero na sua assinatura. Matrizes em assinaturas de método do Tempo de Execução do Windows devem ter uma associação inferior de zero. |
WME1035 |
O método “{0}” tem um matriz multidimensional do tipo “{1}” na sua assinatura. Matrizes em assinaturas de método do Tempo de Execução do Windows devem ser unidimensionais. |
WME1036 |
O método “{0}” tem uma matriz aninhada de tipo “{1}” na sua assinatura. Matrizes em assinaturas de método do Tempo de Execução do Windows não podem ser aninhadas. |
Os parâmetros da matriz devem especificar se o conteúdo da matriz é de leitura ou de gravação
No Tempo de Execução do Windows, os parâmetros devem ser somente leitura ou somente gravação. Os parâmetros não podem ser marcados comoref (ByRef sem o atributo OutAttribute no Visual Basic). Isso se aplica ao conteúdo das matrizes, portanto, os parâmetros da matriz devem indicar se o conteúdo da matriz é somente leitura ou somente gravação. A direção é clara para os parâmetros out (parâmetroByRef com o atributo OutAttribute no Visual Basic), mas os parâmetros de matriz que são transmitidos por valor (ByVal no Visual Basic) devem ser marcados. Consulte Passando matrizes para o componente Tempo de Execução do Windows.
Número do erro |
Texto da mensagem |
---|---|
WME1101 |
O método “{0}” tem o parâmetro “{1}” que é uma matriz, e que tem 2} {e} {3. No Tempo de Execução do Windows, os parâmetros da matriz de conteúdo devem ser de leitura ou de gravação. Remova um dos atributos de “{1}”. |
WME1102 |
O método “{0}” tem um parâmetro de saída “{1}” que é uma matriz, mas que tem {2}. No Tempo de Execução do Windows, o conteúdo das matrizes de saída são de gravação. Remova o atributo de “{1}”. |
WME1103 |
O método “{0}” tem o parâmetro “{1}” que é uma matriz, e que tem um System.Runtime.InteropServices.InAttribute ou um System.Runtime.InteropServices.OutAttribute. No Tempo de Execução do Windows, os parâmetros da matriz devem ter qualquer {2} ou {3}. Remova esses atributos ou substitua-os pelo atributo apropriado do Tempo de Execução do Windows, se necessário. |
WME1104 |
O método “{0}” tem o parâmetro “{1}” que não é uma matriz, e que tem 2} ou {3}. O Tempo de Execução do Windows não oferece suporte à marcação de parâmetros que não sejam de matriz com {2} ou {3}. |
WME1105 |
O método “{0}” tem o parâmetro “{1}” com um System.Runtime.InteropServices.InAttribute ou um System.Runtime.InteropServices.OutAttribute. O Tempo de Execução do Windows não oferece suporte à marcação de parâmetros com System.Runtime.InteropServices.InAttribute ou System.Runtime.InteropServices.OutAttribute. Considere a remoção de System.Runtime.InteropServices.InAttribute e a substituição de System.Runtime.InteropServices.OutAttribute pelo modificador “out". O método “{0}” tem o parâmetro “{1}” com um System.Runtime.InteropServices.InAttribute ou um System.Runtime.InteropServices.OutAttribute. O Tempo de Execução do Windows oferece suporte somente à marcação de parâmetros ByRef com System.Runtime.InteropServices.OutAttribute, e não oferece suporte a outros usos desses atributos. |
WME1106 |
O método “{0}” tem o parâmetro “{1}” que é uma matriz. No Tempo de Execução do Windows, o conteúdo dos parâmetros da matriz deve ser de leitura ou de gravação. Aplique {2} ou {3} a "{1}". |
Membro com um parâmetro denominado "valor"
No Tempo de Execução do Windows, os valores de retorno são considerados parâmetros de saída e os nomes dos parâmetros devem ser exclusivos. Por padrão, Winmdexp.exe fornece ao valor de retorno o nome “valor”. Se o método tiver um parâmetro denominado “valor”, você receberá o erro WME1092. Há duas maneiras de corrigir isso:
Dar ao seu parâmetro um nome diferente de “valor” (em acessadores de propriedade, um nome diferente de "returnValue").
Usar o atributo ReturnValueNameAttribute para alterar o nome do valor de retorno, como mostrado aqui:
using System.Runtime.InteropServices; using System.Runtime.InteropServices.WindowsRuntime; [return: ReturnValueName("average")] public int GetAverage(out int lowValue, out int highValue)
Imports System.Runtime.InteropServices Imports System.Runtime.InteropServices.WindowsRuntime Public Function GetAverage(<Out> ByRef lowValue As Integer, _ <Out> ByRef highValue As Integer) As <ReturnValueName("average")> String
Dica
Se você alterar o nome do valor de retorno, e o novo nome colidir com o nome de outro parâmetro, você receberá o erro WME1091.
O código JavaScript pode acessar os parâmetros de saída de um método pelo nome, incluindo o valor de retorno. Por exemplo, consulte o atributo ReturnValueNameAttribute.
Número do erro |
Texto da mensagem |
---|---|
WME1091 |
O método “{0}” tem o valor de retorno chamado “{1}” que é o mesmo que um nome de parâmetro. Os parâmetros e o valor de retorno do método do Tempo de Execução do Windows devem ter nomes exclusivos. |
WME1092 |
O método '{0}' tem um parâmetro denominado '{1}' que é o mesmo que o nome do valor de retorno padrão. Pense na possibilidade de usar outro nome para o parâmetro ou use System.Runtime.InteropServices.WindowsRuntime.ReturnValueNameAttribute para especificar explicitamente o nome do valor de retorno.
Observação
O nome padrão é "returnValue" apenas para os acessadores da propriedade e "value" para todos os outros métodos.
|
Consulte também
Referência
Winmdexp.exe (Ferramenta de Exportação de Metadados do Tempo de Execução do Windows)
Conceitos
Criando componentes do Tempo de Execução do Windows em C# e Visual Basic