Descarregar COM DLL do programa de .net
Pergunta
Nós temos um aplicativo .NET a partir do qual a C ++ COM componente está sendo instanciado. Nós carregar o componente COM a partir de uma janela de formulário filho. Há um recurso comum que está a ser editado pela aplicação Net, que inturn está a ser usado pelo DLL para o arranque.
Quando a seguinte seqüência de etapas são executadas:
1. Componente Instantiate COM na nova janela filho
O componente COM é instanciado, e é usado pelo formulário filho, e depois de ser usado, ele está sendo definido como NULL, esperando que o componente COM seria descarregado.
2. Manter aberto janela filho, e depois editar o recurso
3. Agora, vá e "refrescar" a forma, para criar uma nova instância COM, para ver o refelection do recurso alterado -., Mas o recurso não é atualizado
Nós também utilizado o método Marshal.ReleaseComObject, mas sem sucesso. Conselho por favor.
Nenhuma solução correta
Outras dicas
Uma vez que uma DLL é carregado para um Net domínio de aplicação, não é possble para forçar um DLL a ser descarregado. É uma limitação infeliz do CLR. Se for absolutamente necessário a DLL para descarregar você pode fazer o seguinte.
- Criar um novo AppDomain
- Coloque o DLL para a nova DLL
- Faça o trabalho no novo AppDomain
- Descarregar o novo AppDomain
Se uma DLL é carregada somente em um domínio de aplicação, o domínio de aplicação da descarga irá descarregar o DLL bem. Portanto, este terá a DLL descarregado. No entanto, é uma resposta muito pesado.
objeto COM e DLL são duas coisas diferentes, mesmo que se reside em outro. Alguns hacks são possíveis, mas muito melhor solução é reescrever esta parte de forma mais sensata que não depende de DLL descarga.
A em clrInterop página descreve muito perto o que você delineado na sua pergunta. O coletor de lixo não descarregar a dll nativa. Cito:. "Pode ser muito perigoso para clr fazer isso porque pode haver outro código (mesmo código nativo) que depende que dll Se você garantir que dll não é usado mais, chamando a API do Windows como FreeLibrary pode ser caminho mais fácil para descarregar a DLL. "
Então, você vai precisar de interoperabilidade FreeLibrary e usar isso para descarregar a dll nativa. Embora eu poderia acrescentar:. Não se pode tentar encontrar uma solução onde você não precisa descarregar a dll