The strange case of "LoaderLock was detected" with a COM add-in written in .NET

Since some days ago, I was getting the following error when closing Visual Basic 6.0 from the Visual Studio debugger (I am developing a .NET-based version of MZ-Tools for the 64-bit VBA editor of Office, and VB6 will get it too):

LoaderLock was detected
Message: Attempting managed execution inside OS Loader lock. Do not attempt to run managed code inside a DllMain or image initialization function since doing so can cause the application to hang.

This is a warning of the Managed Debugging Assistants (MDA) of Visual Studio.

Today I decided to investigate. Soon it was clear that it was caused by the test-runner add-in that I created to run integration tests within VB 6.0. Since the error was caused during shutdown, I removed initializations (and the corresponding cleanups) to isolate the problem and I discovered that the problem was in this method:

      internal List<string> GetAddinProgIds()
      {
         List<string> colAddinProgIds;

         colAddinProgIds = new List<string>();

         foreach (AddIn objAddIn in m_objVBE.Addins)
         {
            colAddinProgIds.Add(objAddIn.ProgId);
         }
         return colAddinProgIds;
      }

That method gets the registered add-ins of the VBE object (to load them in a combobox and select an add-in to run its test suites).

I soon realized that maybe I should release propertly some COM object and certainly the problem was fixed:

      internal List<string> GetAddinProgIds()
      {
         List<string> colAddinProgIds;
         Addins colAddins;

         colAddinProgIds = new List<string>();

         colAddins = m_objVBE.Addins;
         foreach (AddIn objAddIn in colAddins)
         {
            colAddinProgIds.Add(objAddIn.ProgId);
         }
     
         // The following statement is to prevent the following error:
         // LoaderLock was detected
         // Message: Attempting managed execution inside OS Loader lock. Do not attempt to run managed code inside a DllMain
         // or image initialization function since doing so can cause the application to hang.
         System.Runtime.InteropServices.Marshal.ReleaseComObject(colAddins);
        
         colAddins = null;

         return colAddinProgIds;
      }

Published Sun, Mar 17 2013 2:07 by carlosq

Comments

# re? with a COM add-in written in .NET

MSFT shouldn't have allowed to write addins in managed languages in the first place. Thank god they are blocked in the Shell now.

Tuesday, March 19, 2013 4:53 PM by mckaber