public override IEnumerable <AttachProgramOptions> Create(AttachProgramOptionsProviderContext context)
        {
            var groupAddr = IPAddress.Parse("225.0.0.222");
            var foundIds  = new HashSet <PlayerId>();

            using (var receiver = new UnityDataReceiver(maxWaitTime, context.CancellationToken)) {
                foreach (var addr in GetAddresses(context.CancellationToken))
                {
                    context.CancellationToken.ThrowIfCancellationRequested();
                    foreach (var port in multicastPorts)
                    {
                        receiver.Add(groupAddr, port, addr);
                    }
                }
                receiver.Start();
                for (;;)
                {
                    context.CancellationToken.ThrowIfCancellationRequested();
                    var data = receiver.GetNextData();
                    if (data is null)
                    {
                        break;
                    }
                    var s = Encoding.UTF8.GetString(data);
                    if (!TryParseUnityPlayerData(s, out var ipAddress, out var port, out var id))
                    {
                        continue;
                    }

                    var playerId = new PlayerId(ipAddress, port);
                    if (!foundIds.Add(playerId))
                    {
                        continue;
                    }
                    var pid = NetUtils.GetProcessIdOfListenerLocalAddress(IPAddress.Any.MapToIPv4().GetAddressBytes(), port);
                    if (pid is null)
                    {
                        foundIds.Remove(playerId);
                        continue;
                    }
                    if (!ProcessUtils.IsValidProcess(context, pid.Value, null))
                    {
                        continue;
                    }
                    ipAddress = "127.0.0.1";
                    yield return(new UnityAttachProgramOptionsImpl(pid.Value, ipAddress, port, "Unity (" + id + ")"));
                }
            }
        }
Example #2
0
        public override IEnumerable <AttachProgramOptions> Create(AttachProgramOptionsProviderContext context)
        {
            var processes = Process.GetProcessesByName("Unity");

            try {
                foreach (var p in processes)
                {
                    if (!ProcessUtils.IsValidProcess(context, p.Id, p))
                    {
                        continue;
                    }
                    context.CancellationToken.ThrowIfCancellationRequested();
                    ushort       port      = (ushort)(56000 + p.Id % 1000);
                    const string ipAddress = "127.0.0.1";
                    yield return(new UnityAttachProgramOptionsImpl(p.Id, ipAddress, port, $"Unity ({dnSpy_Debugger_DotNet_Mono_Resources.UnityEditor})"));
                }
            }
            finally {
                foreach (var p in processes)
                {
                    p.Dispose();
                }
            }
        }