/* TShock, a server mod for Terraria Copyright (C) 2021-2022 Pryaxis & TShock Contributors This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* * The purpose of this project is to be the launcher of the TSAPI server. * We use this project: * - to copy/move around TShockAPI.dll (the TShock plugin to TSAPI) * - to publish TShock releases. * - move dependencies to a ./bin folder * * The assembly name of this launcher (TShock.exe) was decided on by a community poll. */ using System.Reflection; Dictionary _cache = new Dictionary(); System.Runtime.Loader.AssemblyLoadContext.Default.Resolving += Default_Resolving; await StartAsync(); /// /// Resolves a module from the ./bin folder, either with a .dll by preference or .exe /// Assembly? Default_Resolving(System.Runtime.Loader.AssemblyLoadContext arg1, AssemblyName arg2) { if (arg2?.Name is null) return null; if (_cache.TryGetValue(arg2.Name, out Assembly? asm) && asm is not null) return asm; var loc = Path.Combine(AppContext.BaseDirectory, "bin", arg2.Name + ".dll"); if (File.Exists(loc)) asm = arg1.LoadFromAssemblyPath(loc); loc = Path.ChangeExtension(loc, ".exe"); if (File.Exists(loc)) asm = arg1.LoadFromAssemblyPath(loc); if(asm is not null) _cache[arg2.Name] = asm; return asm; } /// /// Initiates the TSAPI server. /// /// This method exists so that the resolver can attach before TSAPI needs its dependencies. async Task StartAsync() { if (args.Length > 0 && args[0].ToLower() == "plugins") { var items = args.ToList(); items.RemoveAt(0); await TShockPluginManager.NugetCLI.Main(items); return; } TerrariaApi.Server.Program.Main(args); }