Estou sempre fazendo referência a DLLs em meu código C #, mas elas permanecem um mistério que gostaria de esclarecer. Esta é uma espécie de despejo cerebral de perguntas sobre DLLs.
Eu entendo que uma DLL é uma biblioteca vinculada dinamicamente, o que significa que outro programa pode acessar essa biblioteca em tempo de execução para obter "funcionalidade". No entanto, considere o seguinte projeto ASP.NET com Web.dll
e Business.dll
( Web.dll
é a funcionalidade de front end e faz referência Business.dll
a tipos e métodos).
Em que ponto o
Web.dll
link está dinamicamenteBusiness.dll
? Você percebe muitas dificuldades no disco rígido do Windows para tarefas aparentemente pequenas ao usar o Word (etc.) e eu imagino que o Word está desativando e vinculando dinamicamente a funcionalidade de outras DLLs?1a. Além disso, o que carrega e vincula a DLL - o sistema operacional ou alguma estrutura de tempo de execução como a estrutura .NET?
1b. Qual é o processo de "vinculação"? São feitas verificações de compatibilidade? Carregando na mesma memória? O que realmente significa vincular?
O que realmente executa o código na DLL? Ele é executado pelo processador ou há outro estágio de tradução ou compilação antes que o processador compreenda o código dentro da DLL?
2a. No caso de uma DLL construída em C # .NET, o que está executando isso: a estrutura .NET ou o sistema operacional diretamente?
Uma DLL do Linux funciona em um sistema Windows (se tal existir) ou são específicas do sistema operacional?
As DLLs são específicas para uma determinada estrutura? Uma DLL criada com C # .NET pode ser usada por uma DLL criada com, por exemplo, Borland C ++?
4a. Se a resposta a 4 for "não", qual é o objetivo de uma DLL? Por que as várias estruturas não usam seus próprios formatos para arquivos vinculados? Por exemplo: um .exe integrado ao .NET sabe que um tipo de arquivo .abc é algo que pode ser vinculado a seu código.
Voltando à
Web.dll
/Business.dll
exemplo - para obter um tipo de classe de cliente eu preciso de referênciaBusiness.dll
deWeb.dll
. Isso deve significar queBusiness.dll
contém algum tipo de especificação sobre o que uma classe de cliente realmente é. Se eu tivesse compilado meuBusiness.dll
arquivo em, digamos, Delphi: o C # entenderia e seria capaz de criar uma classe de cliente, ou há algum tipo de informação de cabeçalho ou algo que diz "ei, desculpe, você só pode me usar de outra DLL Delphi" ?5a. O mesmo se aplica a métodos; posso escrever um
CreateInvoice()
método em uma DLL, compilá-lo em C ++ e, em seguida, acessá-lo e executá-lo em C #? O que me impede ou me permite de fazer isso?Sobre o assunto de sequestro de DLL, certamente a DLL de substituição (ruim) deve conter as assinaturas e tipos de método exatos como aquele que está sendo sequestrado. Suponho que isso não seria difícil de fazer se você pudesse descobrir quais métodos estão disponíveis na DLL original.
6a. O que em meu programa C # está decidindo se posso acessar outra DLL? Se minha DLL sequestrada contivesse exatamente os mesmos métodos e tipos do original, mas fosse compilada em outro idioma, isso funcionaria?
O que é importação de DLL e registro de DLL?