I’m new to C++/CLI, so please bear with me…
I’m working on a mixed C++/CLI DLL, which should act as a bridge between a Win32 process and a .NET assembly. In the DLL, I need some .NET stuff to be present during the lifespan of the DLL. Initializing is not that big a problem, but I couldn’t figure out when can I safely cleanup the .NET stuff. The usual C++ facilities (DLL_PROCESS_DETACH, global variables and static locals d’tors) all seem to be called after the CLR has gone away.
So, what is the way to get notified the DLL is about to detach from the CLR, so I can release the .NET references I hold?
Well, answering my own question seems awkward, but this wasn’t suggested by anyone else, and it is what I was looking for… so:
turns out Microsoft offers an exotic variation of onexit, called _onexit_m, which should be used in mixed-mode DLLs. When using _onexit_m to register a (managed) callback function, that function will be called when the DLL is about to be unloaded, but before the CLR has been shut down. It is similar to AppDomain.DomainUnload, suggested by Ben Voigt, but for some reason I couldn’t get DomainUnload to work, and _onexit_m is simpler to use IMHO.