public static void Initialise()

in unity/EditorPlugin/Protocol/UnityEditorProtocol.cs [69:152]


    public static void Initialise(Lifetime appDomainLifetime, long initTime, ILog logger)
    {
      ourLogger = logger;
      ourInitTime = initTime;

      var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory());
      var solutionNames = new List<string> { currentDirectory.Name };

      ourLogger.Verbose("Initialising protocol. Looking for solution files");

      var solutionFiles = currentDirectory.GetFiles("*.sln", SearchOption.TopDirectoryOnly);
      foreach (var solutionFile in solutionFiles)
      {
        var solutionName = Path.GetFileNameWithoutExtension(solutionFile.FullName);
        if (!solutionName.Equals(currentDirectory.Name))
        {
          solutionNames.Add(solutionName);
        }
      }

      var protocols = new List<ProtocolInstance>();

      // If any protocol connection is lost, we will drop all connections and recreate them
      var allProtocolsLifetimeDefinition = appDomainLifetime.CreateNested();
      foreach (var solutionName in GetSolutionNames())
      {
        var port = CreateProtocolForSolution(appDomainLifetime, allProtocolsLifetimeDefinition.Lifetime, solutionName,
          () => allProtocolsLifetimeDefinition.Terminate());

        if (port == -1)
          continue;

        protocols.Add(new ProtocolInstance(solutionName, port));
      }

      if (!protocols.Any())
      {
        ourLogger.Warn("Initialising protocol failed.");
        return;
      }

      allProtocolsLifetimeDefinition.Lifetime.OnTermination(() =>
      {
        if (appDomainLifetime.IsAlive)
        {
          ourLogger.Verbose("Schedule recreating protocol, project lifetime is alive");
          new Thread(() =>
          {
            Thread.Sleep(1000);

            if (appDomainLifetime.IsAlive)
            {
              ourLogger.Verbose("Before MainThreadDispatcher.Instance.Queue(() =>");
              MainThreadDispatcher.Instance.Queue(() =>
              {
                ourLogger.Verbose("Inside MainThreadDispatcher.Instance.Queue(() =>");
                if (appDomainLifetime.IsAlive)
                {
                  ourLogger.Verbose("Recreating protocol, project lifetime is alive");
                  Initialise(appDomainLifetime, initTime, logger);
                }
              });
            }
          }).Start();
        }
        else
        {
          ourLogger.Verbose("Protocol will be recreated on next domain load, plugin lifetime is not alive");
        }
      });

      ourLogger.Verbose("Writing Library/ProtocolInstance.json");
      var protocolInstancePath = Path.GetFullPath("Library/ProtocolInstance.json");
      var result = ProtocolInstance.ToJson(protocols);
      File.WriteAllText(protocolInstancePath, result);

      // TODO: Will this cause problems if we call Initialise a second time?
      // Perhaps we need another lifetime?
      appDomainLifetime.OnTermination(() =>
      {
        ourLogger.Verbose("Deleting Library/ProtocolInstance.json");
        File.Delete(protocolInstancePath);
      });
    }