Você está offline; aguardando reconexão

Erro: Mensagem de erro ao tentar passar um objeto de coleção de componentes do Visual Basic 6.0 para Visual Basic 2005 ou Visual Basic. NET: "System.InvalidCastException"

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 323737
Sintomas
Ao tentar passar um objeto de coleção de componentes do Microsoft Visual Basic 6.0 para o Microsoft Visual Basic 2005 ou para o Microsoft Visual Basic. NET, você receberá uma mensagem de erro. No Microsoft Visual Studio 2005, você receber a seguinte mensagem de erro:
Ocorreu uma exceção sem tratamento do tipo 'System.InvalidCastException' em .exe ApplicationName
Obter informações adicionais: não é possível converter objeto do tipo 'Microsoft.VisualBasic.Collection' digite 'VBA.Collection'.
No Microsoft Visual Studio. NET, você receber a seguinte mensagem de erro:
Ocorreu uma exceção sem tratamento do tipo 'System.InvalidCastException' em .exe ApplicationName
Obter informações adicionais: especificado a conversão não é válida.
Se você examinar o tipo do objeto da coleção Visual Basic 2005 ou Visual Basic .NET em espera, você encontrar Visual Basic 2005 ou Visual Basic .NET espera que o tipo de VBA.Collection em vez do tipo Microsoft.VisualBasic.Collection . Se você alterar seu código para passar um objeto da coleção do tipo VBA.Collection , você receber a seguinte mensagem de erro na linha de código em que você tentar criar uma nova instância da classe VBA.Collection :
Uma exceção sem tratamento do tipo 'System.Runtime.InteropServices.COMException' ocorreu no .exe de ApplicationName
Obter informações adicionais: o objeto COM CLSID {A4C4671C-499F-101B-BB78-00AA00383CBB} é inválido ou não registrado.
Esse problema também ocorre em outros Microsoft .NET Framework com suporte idiomas, como Microsoft Visual translation from VPE for Csharp 2005 e versões anteriores do .NET Framework com suporte Microsoft Visual translation from VPE for Csharp.
Causa
O erro InvalidCastException ocorre porque o tipo de Microsoft.VisualBasic.Collection é incompatível com o tipo VBA.Collection . O erro COMException ocorre porque apenas um Visual Basic 6.0 aplicativo pode criar uma instância da classe VBA.Collection . Não é possível criar uma instância da classe VBA.Collection fora de um aplicativo Visual Basic 6.0.
Como Contornar
Para contornar esse problema, crie um objeto VBA.Collection em um aplicativo Visual Basic 6.0 e retornar o objeto para o aplicativo Visual Basic 2005 ou Visual Basic .NET. Para fazer isso, você pode criar uma nova DLL de Visual Basic 6.0 ou adicionar um novo método na DLL existente.

Observação O índice do objeto coleção no Visual Basic 2005 ou no Visual Basic .NET é base 1. No entanto, o índice do Visual Basic 6.0 é base 0. Portanto, talvez seja necessário modificar a Visual Basic 6.0 DLL usar 1 base como o índice para sua coleção em vez de base 0.

Criar uma DLL de 6.0 do Visual Basic retorna a coleção

  1. Criar uma DLL do Visual Basic 6.0 Microsoft ActiveX projeto. Por padrão, a classe Class1 é criada.
  2. Renomeie o projeto CollectionFactory e, em seguida, renomeie a classe clsVBACollection .
  3. Adicione o seguinte código para o class. clsVBACollection
    ' This function creates a new object of the VBA collection.Public Function CreateVBACollection() As Collection   ' Define a variable of type Collection.   Dim col As Collection   ' Create a Collection object.   Set col = New Collection   ' Return the Collection object.   Set CreateVBACollection = colEnd Function
  4. No menu arquivo , clique em tornar CollectionFactory.dll .
  5. Inicie o Visual Studio .NET ou Visual Studio 2005. Criar um console de projeto de aplicativo usando Visual Basic 2005 ou Visual Basic.NET. Por padrão, o arquivo Module1.vb é criado.
  6. No Solution Explorer, clique com o botão direito do mouse em References e, em seguida, clique em Add Reference .

    Observação No Visual Studio 2005, clique no nome projeto e, em seguida, clique em Add Reference .
  7. Na caixa de diálogo Add Reference , clique na guia COM .
  8. Clique em Procurar e, em seguida, localize CollectionFactory.dll . Clique em OK .

    Observação No Visual Studio 2005, clique em CollectionFactory.dll e, em seguida, clique em OK .
  9. Substitua o método Sub Main com o código a seguir.
       Sub Main()      ' Create a new instance of the clsVBSCollection class.      Dim objVBACollection As New CollectionFactory.clsVBACollectionClass()      ' The following variable stores the collection object that the CollectionFactory DLL returns.      Dim col As VBA.CollectionClass      ' Get the VBA.Collection object.      col = objVBACollection.CreateVBACollection()      ' Use the collection as you typically would do so.      col.Add("Microsoft")   End Sub
Situação
A Microsoft confirmou que esse é um problema nos produtos da Microsoft listados na seção "Aplica-se a".
Mais Informações

Etapas para reproduzir o problema

  1. Criar uma DLL do Visual Basic 6.0 Microsoft ActiveX projeto. Por padrão, a classe Class1 é criada.
  2. Adicione o seguinte código para class. Class1
    Public Function GetCollection(col As Collection) As Variant   GetCollection = col(1)End Function
  3. No menu Project , clique em Propriedades . Renomeie o projeto TestCollection.
  4. No menu arquivo , clique em tornar TestCollection.dll .
  5. No Visual Studio 2005 ou no Visual Studio. NET, criar um aplicativo de console projeto usando Visual Basic 2005 ou Visual Basic.NET. Por padrão, o arquivo Module1.vb é criado.
  6. No Solution Explorer, clique com o botão direito do mouse em References e, em seguida, clique em Add Reference .

    Observação No Visual Studio 2005, clique no nome projeto e, em seguida, clique em Add Reference .
  7. Na caixa de diálogo Add Reference , clique na guia COM .
  8. Clique em Procurar e, em seguida, localize TestCollection.dll . Clique em OK .

    Observação No Visual Studio 2005, clique em TestCollection.dll e, em seguida, clique em OK .
  9. Substitua o método Sub Main com o código a seguir.
       Sub Main()      ' Create a Microsoft.VisualBasic.Collection object.      Dim col As New Collection()      Dim objTestCol As New TestCollection.Class1Class()      Dim objRetVal As Object      ' Add an item to the collection.      col.Add("Hello World")      ' Pass the collection as a parameter.      objRetVal = objTestCol.GetCollection(col)   End Sub
  10. No menu Debug , clique em Iniciar para executar o aplicativo. Você receber a primeira mensagem de erro mencionada na seção "Sintomas".
  11. Clique em continuar .
  12. Localize a seguinte linha de código.
       Dim col As New Collection()
  13. Substituir a linha de código localizado na etapa 12 com a seguinte linha de código.
       Dim col As New VBA.CollectionClass()
  14. No menu Debug , clique em Iniciar para executar o aplicativo. Você receber a segunda mensagem de erro mencionada na seção "Sintomas".
Referências
Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
316163Mensagens de erro ao tentar criar um projeto Class Library em Visual Basic.NET ou em Visual Basic 2005

Propriedades

ID do Artigo: 323737 - Última Revisão: 02/08/2007 19:14:50 - Revisão: 3.0

Microsoft Visual Basic 2005, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic Enterprise Edition for Windows 6.0

  • kbmt kbvs2005swept kbvs2005applies kbvs2002sp1sweep kberrmsg kbmsg kbdll kbcollections kbcollectionclass kbinterop kbautomation kbappcompatibility kbbug KB323737 KbMtpt
Comentários
; guid; m.name = "ms.dqid"; document.getElementsByTagName("head")[0].appendChild(m);