Domanda

Abbiamo un'applicazione .Net da cui viene istanziato un componente COM C++.Carichiamo il componente COM da una finestra del modulo figlio.Esiste una risorsa comune che viene modificata dall'applicazione .Net, che a sua volta viene utilizzata dalla DLL COM per l'avvio.

Quando viene eseguita la seguente sequenza di passaggi:
1.Componente COM Istanzia nella finestra del nuovo bambino il componente COM è istanziato e viene utilizzato dalla forma del bambino e, dopo essere stato utilizzato, viene impostato su NULL, sperando che il componente COM venga scaricato.
2.Mantieni aperta la finestra secondaria e quindi modifica la risorsa
3.Ora vai e "aggiorna" il modulo, per creare una nuova istanza COM, per vedere il riflesso della risorsa modificata, ma la risorsa non viene aggiornata.

Abbiamo utilizzato anche il metodo Marshal.ReleaseComObject, ma senza successo.Per favore consiglio.

Nessuna soluzione corretta

Altri suggerimenti

Una volta caricata una DLL in un AppDomain .Net, non è possibile forzare lo scaricamento di una DLL.È una sfortunata limitazione del CLR.Se hai assolutamente bisogno della DLL da scaricare, puoi procedere come segue.

  1. Crea un nuovo dominio applicazione
  2. Caricare la DLL nella nuova DLL
  3. Esegui il lavoro nel nuovo AppDomain
  4. Scarica il nuovo AppDomain

Se una DLL viene caricata solo in un AppDomain, lo scaricamento di AppDomain scaricherà anche la DLL.Quindi questo scaricherà la DLL.Tuttavia è una risposta piuttosto pesante.

L'oggetto COM e la DLL sono due cose diverse, anche se l'uno risiede in un altro.Alcuni hack sono possibili, ma la soluzione migliore è riscrivere questa parte in un modo più sensato che non si basi sullo scaricamento delle DLL.

UN discussione sulla pagina clrInterop descrive molto da vicino ciò che hai delineato nella tua domanda.Il Garbage Collector non scarica la DLL nativa.Quoto:" Potrebbe essere molto pericoloso per clr farlo perché potrebbe esserci altro codice (anche codice nativo) che dipende da quella dll.Se ti assicuri che la dll non venga più utilizzata, chiamare un'API di Windows come FreeLibrary potrebbe essere il modo più semplice per scaricare la dll."

Quindi dovrai interoperare FreeLibrary e usarlo per scaricare la DLL nativa.Anche se potrei aggiungere:non farlo se puoi provare a trovare una soluzione in cui non è necessario scaricare la DLL.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top