Inquiridor
Conversão de DLL VB6 para DLL VBNET

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 MinhaClasseEnd 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 InterfaceEsta é 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:
segunda-feira, 19 de fevereiro de 2007 02:28