locked
Conversão de DLL VB6 para DLL VBNET RRS feed

  • Pergunta

  • Eu converti uma DLL em VB6 para VB.NET (2003) e compilei com a opção "Register for COM Interop". Em seguida referenciei no Access o arquivo .tlb gerado na compilação. A referência foi incluída.

    Entretanto, quando tento executar, o access encerra, cancela. Funciona há bastante tempo com a DLL VB6.

    Notei que não consigo ver os métodos das diversas classes da DLL, assim como consigo quando executo com a DLL do VB6.

    Se alguém puder ajudar será muito apreciado.

    Utilizo o Access 2003

    sábado, 17 de fevereiro de 2007 19:43

Todas as Respostas

  • Você precisa marcar a classe como visível para componentes COM. Você tem três opções:

    1) Decorar a classe com o atributo ClassInterface, valor ClassInterfaceType.AutoDual, assim:

    <Runtime.InteropServices.ClassInterface(Runtime.InteropServices.ClassInterfaceType.None)> _
    Public Class MinhaClasse

    End Class

    Esta opção não é recomendada.

    2) Decorar a classe com o atributo ComClass, como descrito aqui:

    http://msdn2.microsoft.com/en-us/library/57kx88c8(VS.71).aspx

    Esta opção também deveria ser evitada.

    3) Decorar a classe com o o atributo ClassInterface, valor ClassInterfaceType.None e implementar uma interface que exponha os métodos da classe. Por exemplo, suponha que você tenha uma classe "Matematica" e queira tornar o método Soma() visível. Você faria algo assim:

    <Runtime.InteropServices.ClassInterface(Runtime.InteropServices.ClassInterfaceType.None)> _
    Public Class Matematica
        Implements IMatematica
        Public Function Soma(ByVal op1 As Double, ByVal op2 As Double) As Double Implements IMatematica.Soma
            Return op1 + op2
        End Function
    End Class

    ' Interface
    Public Interface IMatematica
        Function Soma(ByVal op1 As Double, ByVal op2 As Double) As Double
    End Interface

    Esta é a opção preferencial.

    Quanto ao erro, difícil dizer sem uma mensagem de erro e sem ver código. O Erro acontece quando você tenta invocar um método? Se sim, poste o código do método etc.

    domingo, 18 de fevereiro de 2007 03:50
  • MacGyver

    Obrigado por sua resposta. Iniciei a criação de interfaces e os métodos se tornaram visíveis na DLL. Ainda não comecei a testar, pois tenho várias classes com diversos métodos em cada uma. Vou ter que criar intefaces para cada classe e as declarações dos métodos.

    Não entra muito bem em minha cabeça ter que re-declarar os métodos já declarados nas classes. Mas, se esta é a única solução, vamos lá.

    Muito obrigado pela ajuda

     

    domingo, 18 de fevereiro de 2007 23:53
  • Componentes COM, que é o que o VB6 (e sua versão para Access) entende, são baseados em interfaces, que precisam ser definidas de uma forma ou de outra. O VB6 faz isso por de trás dos panos, como fazem as opções 1 e 2 mencionadas acima para .NET, e o programador não precisa lidar diretamente com as interfaces. Quando se marca um componente .NET para interoperabilidade com componentes COM ("Register for COM interop") uma interface também é gerada, mas uma interface de um tipo que apenas permite o uso dos métodos em "late binding", por isso o código funciona, apesar de o IDE do VB6 não enxergar os métodos.

    Essas opções que fazem as coisas "automagicamente" costumam, no entanto, causar problemas com imcompatibilidade de versões, por isso é melhor evitá-las e definir as interfaces manualmente.

    Mais informações sobre isso nos links:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconqualifyingnettypesforinteroperation.asp

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconintroducingclassinterface.asp

     

    segunda-feira, 19 de fevereiro de 2007 02:28