1

I'm using runtime dll initialization through Assembly.LoadFile to load additional viewports for my project. I've succesfully launched WPF form and CS-SDL form (both built as dll's) that way, but MonoGame form is giving me an error after 60 sec. of running:

Managed Debugging Assistant 'ContextSwitchDeadlock' has detected a problem. The CLR has been unable to transition from COM context 0x5b16f8 to COM context 0x5b1920 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. etc.

Plugin (form built as class library) init code:

foreach (PluginInfo plginfo in _gameManager.XmlReader.ReadViewPlugins(System.Environment.CurrentDirectory + "\\plugins\\plugins.xml"))
{
    if (plginfo.Correct)
    { 
        //create new thread for every plugin 
        Thread thread = new Thread(RunViewControlPlugin);
        thread.Name = plginfo.Name;
        //set it to single-threaded if plugin requires so
        if (plginfo.STA)
            thread.SetApartmentState(ApartmentState.STA);
        thread.Start(plginfo);
    }
}

RunViewControl method:

void RunViewControlPlugin(object data)
    {
        PluginInfo plginfo = (PluginInfo)data;
        string path = System.Environment.CurrentDirectory + "\\plugins\\" + plginfo.FileName;
        //load assembly from the path and create instance of the required type
        Assembly assembly = Assembly.LoadFile(path);
        Type type = assembly.GetType(plginfo.AssemblyData);
        IViewControlPlugin plugin = (IViewControlPlugin)Activator.CreateInstance(type);

        lock(locker)
        {
            _viewcontrolpluginList.Add(plugin);
        }

        //on shutdown close dispatcher, remove plugin from the active plugins list and unsubscribe
        EventHandler handler = null;
        handler = (s, e) =>  {
            if (plginfo.DispatcherNeeded)
                System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvokeShutdown(System.Windows.Threading.DispatcherPriority.Background);
            _gameManager.DebugLogger.LogGeneralInfo(plginfo.Name+" stopped.");
            _viewcontrolpluginList.Remove(plugin);
            plugin.Closed -= handler;
        };
        plugin.Closed += handler;

        //send manager instances to the plugin
        plugin.AddGameDataManager(_gameDataManager);
        plugin.AddGameManager(_gameManager);
        _gameManager.DebugLogger.LogGeneralInfo(plginfo.Name + " started.");

        //start dispatcher (wpf forms require dispatcher to run)
        if (plginfo.DispatcherNeeded)
                System.Windows.Threading.Dispatcher.Run();
        plugin.Start();
    }

I'd like to know how to solve this (besides shutting off MDA). Should I implement message pumping explicitly?

Form is doing fine, it sees mouse/keyboard events and can be moved around. The only issue is the memory leak which can be related to this case (MDA description states it could cause memory leaks).

UPDATE: setting STA off for the XNA thread seems to supress this error, though I do not clearly understand why. Perhaps I should dive into the Windows inner mechanics deeper.

Anatoly Sazanov
  • 1,814
  • 2
  • 14
  • 24

0 Answers0