Carregar Dll dinamicamente

613 views
Skip to first unread message

Antonio Marinho

unread,
Jun 9, 2016, 10:15:42 AM6/9/16
to DotNet Brasil
Bom dia.

Tenho umas Dlls criadas no VB6 que contém regras de negócio imprescindíveis para um novo projeto que desenvolvi em c#.
Eu referenciei essas Dlls em meu projeto e está funcionando perfeitamente. Ocorre que sempre que a Dll sofre alguma alteração, eu preciso registrar essa nova DLL e referencia-la novamente em meu projeto ou começa dar erro em sua abertura.
Verifiquei que se carregar essa DLL em tempo de execução, este erro não ocorre, pois vai abrir a DLL atualizada.
Pesquisando em alguns Fóruns, vi que se no meu projeto utilizar o SYSTEM.Reflection daria para conseguir isso. Segue o código de tentativa :

 var DLL = Assembly.LoadFile(@"H:\DIR\Dll\DESH.dll");

var theType = DLL.GetType("ADM_DESH.Hsp_Adm_DespHospitalares");
var c = Activator.CreateInstance(theType);
var method = theType.GetMethod("FormExibir");
method.Invoke(c, new object[] { 1, "DSN=dominio;UID=user;PWD=X;" });

Porém da erro no LoadFile 
BadImageFormatException was unhandled
O módulo deveria conter um manifesto de assembly. (Exceção de HRESULT: 0x80131018)

Alguém já conseguiu essa façanha de carregar a DLL dinamicamente sem precisar referenciar no projeto ?
abraço

Renato Cantarino

unread,
Jun 9, 2016, 10:17:17 AM6/9/16
to dotn...@googlegroups.com

--
==============================
Comunidade de desenvolvedores Dot Net no Brasil
 
Facebook: www.facebook.com/grupodotnetbr
 
WebSite: www.dotnetbr.com
 
E-mail do Grupo: dotn...@googlegroups.com
==============================
---
You received this message because you are subscribed to the Google Groups "DotNet Brasil" group.
To unsubscribe from this group and stop receiving emails from it, send an email to dotnet_br+...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--

Att,
Renato Cantarino

Husseyn Hussa

unread,
Jun 9, 2016, 11:24:10 AM6/9/16
to dotn...@googlegroups.com
aí fiquei em dúvida também, não é só usar injeção de dependência com um container IOC?

Rubem Rocha

unread,
Jun 9, 2016, 12:27:03 PM6/9/16
to dotn...@googlegroups.com

Com todo o respeito, isso nada tem haver com IoC. Creio que seja uma DLL comum que é chamada como se fosse uma API do Windows. Não deve se tratar, portanto, de um assembly .NET ou uma DLL COM.

Sds.

Erlon Santos

unread,
Jun 9, 2016, 12:43:23 PM6/9/16
to dotn...@googlegroups.com
Boa tarde,
Podem ser duas opções ou seu programa em dotnet esta compilando como 32 bits e a dll é 64 bits ou dotnet esta compilando como 64 bits e a dll é 32 bits..
Tente alterar o tipo de target do seu programa para ver se ajuda..

Bruno Fernandes

unread,
Jun 9, 2016, 12:58:08 PM6/9/16
to Dot Net Brasil
@Antonio Marinho,

Sinceramente eu não sei como resolver sua situação, mas para contextualizar, da forma que você está tentando fazer não vai funcionar pois, da forma em que você fez, só funciona para dlls geradas na plataforma .Net.

Não conheço muito de VB6 mas ela não é uma DLL .Net. Para referenciá-la, você precisará registrá-la (no caso de ser uma dll de componente COM ou COM+). Se for uma DLL estática, as coisas podem ser um pouco mais simples, desde que você não mude a assinatura do método.


Atenciosamente,

Antonio Marinho

unread,
Jun 9, 2016, 2:53:31 PM6/9/16
to DotNet Brasil
Pois é meus amigos. estou com um abacaxi enorme. Essa Dll é em VB6 32 bits, meu sistema SO tbm é 32 bits. O que ocorre é que essa DLL está sempre sendo implementada com novas funcionalidades e ao ser compilada, minha aplicação windows forms c# perde a referencia a mesma. O que tenho que fazer é abrir minha aplicação, excluir a referência, registrar a DLL, referenciar a Dll novamente em minha aplicação e complilar para que meu .EXE rode com as referencias desta DLL. Eu estava procurando abrir esta DLL do VB6 de forma dinâmica, sem ter que referencia-la ao meu projeto. Estou na caça de uma solução em fóruns mas até agora, não encontrei uma resposta satisfatória e ficar referenciando a DLL toda vez que ela é alterada é uma pedreragem doida né. kkk. Se encontrarem algo, por favor postem ai. Eu se encontrar tbm disponibilizo. Valeu.

João Bateloche

unread,
Jun 9, 2016, 3:41:56 PM6/9/16
to dotn...@googlegroups.com
Registrar a dll programaticamente é uma opção?

--

Rubem Rocha

unread,
Jun 9, 2016, 3:45:16 PM6/9/16
to dotn...@googlegroups.com

Eu só queria saber se é essa dll é estática ou é uma dll do tipo COM.

Sds

Antonio Marinho

unread,
Jun 9, 2016, 4:43:01 PM6/9/16
to DotNet Brasil
ola. Essa dll é estática. Mas quase sempre estão implementando novos métodos e recompilando a dll com as alterações

Antonio Marinho

unread,
Jun 9, 2016, 4:46:06 PM6/9/16
to DotNet Brasil
Então João, não saberia informar se esta opção seria viável uma vez que este programa é um  executável que fica rodando no servidor para gerar uns arquivos xml de tempos em tempos. ele funciona bem até que a Dll é atualizada, dai o programa dá pau e eu tenho que refazer o processo de registrar a DLL, referenciar ao meu projeto e recompilar novamente este projeto com a nova DLL.

Rubem Rocha

unread,
Jun 9, 2016, 4:51:50 PM6/9/16
to dotn...@googlegroups.com

Em tese de resolve o problema com uma classe contendo métodos que declaram a chamada dessas funções usando o atributo DllImportAttribute.

Se a chamada de uma função mudar, basta mudar a declaração do método nessa classe.

Referências:

https://msdn.microsoft.com/en-us/library/55d3thsc.aspx

https://pradhananand.wordpress.com/2014/12/31/pinvoke-calling-win32-api-from-c/

https://blogs.msdn.microsoft.com/jonathanswift/2006/10/03/dynamically-calling-an-unmanaged-dll-from-net-c/

Sds

Antonio Marinho

unread,
Jun 9, 2016, 5:00:43 PM6/9/16
to DotNet Brasil
vou tentar usar esses métodos

Marcelo de Souza (Unimake)

unread,
Jun 10, 2016, 8:15:49 AM6/10/16
to dotn...@googlegroups.com

Isso te ajuda?

Exemplo em VB6:

A função abaixo está em uma classe chamada ClasseTeste e o nome do projeto é MeuProjetoDLL

Public Function Mensagem(ByVal texto As String) As Boolean
MsgBox texto
Mensagem = True
End Function

Não é necessário referenciar a DLL, apenas registrá-la, e desta forma chamar a dll dentro do C#.

class Program
    {
        static void Main(string[] args)
        {
            Type minhaDllType = Type.GetTypeFromProgID("MeuProjetoDLL.ClasseTeste"); //Recupera o tipo registrado da classe teste
            dynamic teste = Activator.CreateInstance(minhaDllType); //Instancia o tipo
            bool result = teste.Mensagem("Teste de chamada externa"); //Chama  o método e recupera o resultado
            Console.WriteLine(result);
            Console.ReadKey();
        }
    }

Lembrado que , se a assinatura do método for alterada, dará erro em tempo de execução. E não de compilação.
Uma outra ideia seria você ter classes proxies em C# para acessar a sua DLL em VB6.

É isso... :)

[]´s

Atenciosamente

Acaz Souza Pereira

unread,
Jun 10, 2016, 8:34:16 AM6/10/16
to DotNet Brasil
Esta sua DLL não é um COM? Tem como exporta-la como COM?
Se sim, você consegue carregar ela sem registrar se o MANIFESTO dela estiver junto.


Em quinta-feira, 9 de junho de 2016 11:15:42 UTC-3, Antonio Marinho escreveu:

fernando mondo

unread,
Jun 10, 2016, 9:15:03 AM6/10/16
to DotNet Brasil
Você não deveria "apontar" a referência para a Dll e tentar mudar ela depois.

O procedimento mais comum, seria fazer uma cópia da Dll (ou melhor ainda, implementar um Nuget Local) e sempre que houver uma alteração, você vai ter que atualizar a aplicação (deploy).

Se não é possível/aceito isso, você pode partir para um carregamento dinâmico de Dll, com MEF, apesar de ser um pouco mais complexo fazer isso.

Aqui tem um exemplo de como implementar, funciona como o carregamento de plugins do visual studio:

http://stackoverflow.com/a/11015511/777720

Antonio Marinho

unread,
Jun 13, 2016, 7:56:00 AM6/13/16
to DotNet Brasil
Valeu pelas dicas meus camaradas.
Vou utilizar esses processos ver qual atenderia de forma mais eficiente.

Rubem Rocha

unread,
Jun 13, 2016, 8:01:53 AM6/13/16
to dotn...@googlegroups.com

MEF é estupidamente fácil de usar.

Sds

--
Reply all
Reply to author
Forward
0 new messages