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.

  1. Criar um novo AppDomain
  2. Coloque o DLL para a nova DLL
  3. Faça o trabalho no novo AppDomain
  4. 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top