Rodrigo Strauss :: Blog
Administrando: Substituindo um arquivo que está sendo usado
Um problema muito comum quando precisamos atualizar um arquivo em um servidor (geralmente DLLs) é o seguinte:

Temos duas soluções óbvias nesse caso:
- Dar um boot no servidor e trocar o arquivo na volta do boot. Além de não funcionar algumas vezes (como na existência de um serviço que sobe no boot e usa o arquivo), em outras vezes não é possível (dar boot em um servidor de produção 3 da tarde?).
- Renomear o arquivo atual e copiar o novo. Apesar de funcionar, não faz com que os programas que usam o arquivo o recarreguem.
O que causa esse problema é que muitas vezes não sabermos quem está usando o arquivo. Caso nosso arquivo seja uma DLL de um componente COM in process (DLL que é carregada no processo usuário) é praticamente impossível saber quem o carrega. Ou melhor, é impossível descobrir isso sem a ferramenta certa.
Caso seja um componente COM+ configurado como Server Application (ou seja, sua DLL é carregada em um dllhost.exe), é só mandar um shutdown no pacote e trocar a DLL. Mas apesar dessa facilidade, nem todos podem usá-la, já que isso aumenta o overhead do marshalling entre o processo usuário e o dllhost.exe. Além, é claro, de todas aquelas configurações de segurança.
E a solução do nosso problema, como sempre, passa por www.sysinternals.com. Baixe o Process Explorer, que é um substituto vitaminado para o Task Manager (Gerenciador de Tarefas) que existe no Windows. Dentre todas as informações que ele mostra sobre os processos, está também a lista de handles abertos (os de arquivos inclusive) e DLLs carregadas:

Apesar de bastante interessante, esse recurso não ajuda muito já que você precisa olhar em todos os processos. Até que fala mais alto seu instinto de usuário Microsoft e você tecla CTRL+F. Tudo resolvido:

Resolvido. Agora você sabe quais são os processos que estão usando o arquivo que você precisa trocar. Você pode até dar um kill no processo sem sair do Process Explorer :-)
PS: Quem acha que seria interessante se eu escrevesse sobre COM e COM+ levante a mão.
Em 11/04/2007 18:44, por Rodrigo Strauss





Mão pra cima