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);
});
}