2013-03-24 13 views
7

Se utilizzo C# per P/Richiama una determinata DLL, l'effettiva DLL C++ verrà eseguita per la durata della chiamata e quindi verrà chiusa, distruggendo tutta la memoria utilizzata? Oppure .NET si farà carico della memoria utilizzata dalla DLL C++ in un "heap" non gestito e fornirà i puntatori a tali oggetti alla DLL C++ ogni volta che chiamo una funzione statica?P/Invoke esegue la DLL e quindi la interrompe?

Quando ho bisogno che un determinato progetto C++ mantenga la memoria persistente, dovrei creare un server ActiveX/COM per mantenere la memoria, e tuttavia essere in grado di chiamarlo da C#?

risposta

5

Se utilizzo C# per P/Richiama una determinata DLL, l'effettiva DLL C++ verrà eseguita per la durata della chiamata e quindi verrà chiusa, distruggendo tutta la memoria utilizzata?

No. Una volta caricata, la DLL verrà caricata. La durata della DLL è non legata a una chiamata di funzione. Ciò significa che le variabili nella DLL con memoria statica persistono oltre la chiamata p/invoke iniziale.

+0

Dove viene memorizzata la memoria? Puoi approfondire questo? –

+0

Le DLL non gestite vengono caricate nello spazio indirizzo del dominio dell'applicazione del programma gestito. Si noti che è possibile caricare e scaricare in modo dinamico domini applicazione, che rimuove le DLL non gestite dalla memoria quando il dominio dell'app viene scaricato. –

+0

Dove viene memorizzata la memoria? Sii preciso riguardo alla domanda. –

2

Se si sta creando un oggetto da una DLL C++, esso verrà effettivamente mantenuto finché non lo si elimina o piuttosto lo si elimina. Poiché è necessario rimuovere manualmente gli oggetti non gestiti, rimarrà.

+0

Quindi è possibile avere un progetto C++ completamente funzionante che funziona come una DLL e che ha una semplice funzione statica P/Invoke'd da .NET con niente che si rompa sul lato C++? Anche se il progetto C++ utilizza oggetti e DirectX e cose complesse? –

+0

Dipende da ciò che si capisce perfettamente funzionante? Si consideri ad esempio 'COM', dove si stanno creando componenti non gestiti che è possibile utilizzare in un ambiente gestito. Quindi dovrebbe essere possibile. –

Problemi correlati