From d56fe6d9018f6f00758de62ff8e7c433a3c7ae56 Mon Sep 17 00:00:00 2001 From: MrKev312 <34964788+MrKev312@users.noreply.github.com> Date: Fri, 21 Apr 2023 17:32:31 +0200 Subject: [PATCH] Rewrote Updater --- .editorconfig | 228 ++++++++++++++++++++++++++ Toolbox.sln | 12 +- Updater/App.config | 6 - Updater/Program.cs | 253 ++++++++++------------------- Updater/Properties/AssemblyInfo.cs | 36 ---- Updater/Properties/app.manifest | 70 -------- Updater/Updater.csproj | 93 +++-------- 7 files changed, 346 insertions(+), 352 deletions(-) create mode 100644 .editorconfig delete mode 100644 Updater/App.config delete mode 100644 Updater/Properties/AssemblyInfo.cs delete mode 100644 Updater/Properties/app.manifest diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..4cebf9a7b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,228 @@ +# Remove the line below if you want to inherit .editorconfig settings from higher directories +root = true + +# C# files +[*.cs] + +#### Core EditorConfig Options #### + +# Indentation and spacing +indent_size = 4 +indent_style = space +tab_width = 4 + +# New line preferences +end_of_line = crlf +insert_final_newline = false + +#### .NET Coding Conventions #### + +# Organize usings +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = true +file_header_template = unset + +# this. and Me. preferences +dotnet_style_qualification_for_event = false:suggestion +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_property = false:suggestion + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true:warning +dotnet_style_predefined_type_for_member_access = true:warning + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:suggestion +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:suggestion +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:suggestion + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = for_non_interface_members + +# Expression-level preferences +dotnet_style_coalesce_expression = true +dotnet_style_collection_initializer = true +dotnet_style_explicit_tuple_names = true:warning +dotnet_style_namespace_match_folder = true +dotnet_style_null_propagation = true +dotnet_style_object_initializer = true +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_prefer_auto_properties = true:warning +dotnet_style_prefer_compound_assignment = true +dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_return = true:suggestion +dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed +dotnet_style_prefer_inferred_anonymous_type_member_names = true +dotnet_style_prefer_inferred_tuple_names = true +dotnet_style_prefer_is_null_check_over_reference_equality_method = true +dotnet_style_prefer_simplified_boolean_expressions = true +dotnet_style_prefer_simplified_interpolation = true + +# Field preferences +dotnet_style_readonly_field = true + +# Parameter preferences +dotnet_code_quality_unused_parameters = all + +# Suppression preferences +dotnet_remove_unnecessary_suppression_exclusions = 0 + +# New line preferences +dotnet_style_allow_multiple_blank_lines_experimental = false:suggestion +dotnet_style_allow_statement_immediately_after_block_experimental = false:suggestion + +#### C# Coding Conventions #### + +# var preferences +csharp_style_var_elsewhere = false:warning +csharp_style_var_for_built_in_types = false:warning +csharp_style_var_when_type_is_apparent = false:warning + +# Expression-bodied members +csharp_style_expression_bodied_accessors = when_on_single_line:suggestion +csharp_style_expression_bodied_constructors = false:suggestion +csharp_style_expression_bodied_indexers = true:suggestion +csharp_style_expression_bodied_lambdas = false:suggestion +csharp_style_expression_bodied_local_functions = when_on_single_line:suggestion +csharp_style_expression_bodied_methods = false:suggestion +csharp_style_expression_bodied_operators = false:suggestion +csharp_style_expression_bodied_properties = true:suggestion + +# Pattern matching preferences +csharp_style_pattern_matching_over_as_with_null_check = true +csharp_style_pattern_matching_over_is_with_cast_check = true +csharp_style_prefer_extended_property_pattern = true +csharp_style_prefer_not_pattern = true +csharp_style_prefer_pattern_matching = true:suggestion +csharp_style_prefer_switch_expression = true + +# Null-checking preferences +csharp_style_conditional_delegate_call = true + +# Modifier preferences +csharp_prefer_static_local_function = true +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async +csharp_style_prefer_readonly_struct = true + +# Code-block preferences +csharp_prefer_braces = when_multiline:suggestion +csharp_prefer_simple_using_statement = true:warning +csharp_style_namespace_declarations = file_scoped:suggestion +csharp_style_prefer_method_group_conversion = true:suggestion +csharp_style_prefer_top_level_statements = true:suggestion + +# Expression-level preferences +csharp_prefer_simple_default_expression = true +csharp_style_deconstructed_variable_declaration = true +csharp_style_implicit_object_creation_when_type_is_apparent = true +csharp_style_inlined_variable_declaration = true +csharp_style_prefer_index_operator = true +csharp_style_prefer_local_over_anonymous_function = true +csharp_style_prefer_null_check_over_type_check = true +csharp_style_prefer_range_operator = true +csharp_style_prefer_tuple_swap = true +csharp_style_prefer_utf8_string_literals = true +csharp_style_throw_expression = true +csharp_style_unused_value_assignment_preference = discard_variable +csharp_style_unused_value_expression_statement_preference = discard_variable:suggestion + +# 'using' directive preferences +csharp_using_directive_placement = outside_namespace:suggestion + +# New line preferences +csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = false:suggestion +csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:suggestion +csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:suggestion +csharp_style_allow_blank_lines_between_consecutive_braces_experimental = false:suggestion +csharp_style_allow_embedded_statements_on_same_line_experimental = false:suggestion + +#### C# Formatting Rules #### + +# New line preferences +csharp_new_line_before_catch = true +csharp_new_line_before_else = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_open_brace = all +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = false +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = false + +#### Naming styles #### + +# Naming rules + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +# Symbol specifications + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +# Naming styles + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case diff --git a/Toolbox.sln b/Toolbox.sln index 64765ba87..e475ff933 100644 --- a/Toolbox.sln +++ b/Toolbox.sln @@ -1,18 +1,22 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30011.22 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.33516.290 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "File_Format_Library", "File_Format_Library\File_Format_Library.csproj", "{A11705CF-A6A3-41C3-875A-E1CFD8080F09}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Toolbox_Library", "Switch_Toolbox_Library\Toolbox_Library.csproj", "{96820047-2A39-4E5A-BFA4-E84FFF5C66CF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Updater", "Updater\Updater.csproj", "{D82A2C08-2A65-43AF-BDA6-A36CC27AA003}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Updater", "Updater\Updater.csproj", "{D82A2C08-2A65-43AF-BDA6-A36CC27AA003}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Toolbox", "Toolbox\Toolbox.csproj", "{5E55CA2B-F181-4681-AAFA-A20FEBCF7387}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BrawlboxHelper", "BrawlboxHelper\BrawlboxHelper.csproj", "{FA690685-3370-44D5-B138-F538C8D4C2A3}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{6423B3C7-ABD1-4824-B975-8A1F478899FE}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/Updater/App.config b/Updater/App.config deleted file mode 100644 index 4bfa00561..000000000 --- a/Updater/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Updater/Program.cs b/Updater/Program.cs index 996dd2e8c..46705d33d 100644 --- a/Updater/Program.cs +++ b/Updater/Program.cs @@ -1,192 +1,107 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Octokit; -using System.Net; +using System.Diagnostics; using System.IO.Compression; -using System.IO; -using System.Globalization; -using System.Security.AccessControl; -namespace Updater -{ - class Program - { - static Release[] releases; - - static string execDirectory = ""; - static string folderDir = ""; - static bool foundRelease = false; - - static void Main(string[] args) - { - Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); - - execDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location); - folderDir = execDirectory; +// Set the URL, name, and filename of the file to download +string downloadURL = @"https://github.com/KillzXGaming/Switch-Toolbox/releases/download/Latest/Toolbox-Latest.zip"; +string downloadFilename = $"Toolbox-Latest.zip"; - ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; - var client = new GitHubClient(new ProductHeaderValue("ST_UpdateTool")); - GetReleases(client).Wait(); +// Get the current directory and check if the "-h" or "--hashes" option was passed as an argument +string currentDir = Environment.CurrentDirectory; +bool keepHashes = args.Contains("-h") || args.Contains("--hashes"); - string versionTxt = Path.Combine(execDirectory, "Version.txt"); - if (!File.Exists(versionTxt)) - File.Create(versionTxt); +// Create a new HttpClient and download the file from the specified URL +Console.WriteLine($"Downloading {downloadURL}..."); +using HttpClient httpClient = new(); +HttpResponseMessage response = httpClient.GetAsync(downloadURL).Result; - string[] versionInfo = File.ReadLines(versionTxt).ToArray(); - - string ProgramVersion = ""; - string CompileDate = ""; +try +{ + response.EnsureSuccessStatusCode(); +} +catch (Exception ex) +{ + Console.WriteLine($"Failed to download update!\n{ex}"); +} - string CommitInfo = ""; - if (versionInfo.Length >= 3) - { - ProgramVersion = versionInfo[0]; - CompileDate = versionInfo[1]; - CommitInfo = versionInfo[2]; - } +// Save the downloaded file to disk +Console.WriteLine($"Downloaded {downloadFilename}, saving to disk..."); +byte[] content = response.Content.ReadAsByteArrayAsync().Result; +File.WriteAllBytes(downloadFilename, content); - foreach (string arg in args) +// Extract the contents of the downloaded zip file if it's newer +using (ZipArchive archive = ZipFile.OpenRead(downloadFilename)) +{ + if (updateNeeded(archive)) + { + Console.WriteLine($"Extracting contents of {downloadFilename}..."); + // Loop through all the entries in the zip archive + foreach (ZipArchiveEntry entry in archive.Entries) + { + // Filter out any folders + if (!entry.FullName.EndsWith("/") && + // Ignore updater + !(entry.Name.Equals("updater.exe", StringComparison.OrdinalIgnoreCase) || + entry.Name.Equals("updater.dll", StringComparison.OrdinalIgnoreCase) || + entry.Name.Equals("updater.pdb", StringComparison.OrdinalIgnoreCase)) && + // Skip the "Hashes" folder if the "-h" or "--hashes" option was passed + !(keepHashes && entry.FullName.StartsWith("Hashes/", StringComparison.OrdinalIgnoreCase))) { - switch (arg) - { - case "-d": - case "--download": - Download(CompileDate); - break; - case "-i": - case "--install": - Install(); - break; - case "-b": - case "--boot": - Boot(); - Environment.Exit(0); - break; - case "-e": - case "--exit": - Environment.Exit(0); - break; - } + // Construct the target path for the extracted file and extract it + string targetPath = Path.Combine(currentDir, entry.FullName); + Directory.CreateDirectory(Path.GetDirectoryName(targetPath)); + entry.ExtractToFile(targetPath, overwrite: true); } - Console.Read(); - } - static void Boot() - { - Console.WriteLine("Booting..."); - - Thread.Sleep(3000); - System.Diagnostics.Process.Start(Path.Combine(folderDir, "Toolbox.exe")); } - static void Install() - { - Console.WriteLine("Installing..."); - foreach (string dir in Directory.GetDirectories("master/")) - { - SetAccessRule(folderDir); - SetAccessRule(dir); - - string dirName = new DirectoryInfo(dir).Name; + } +} - if (!dirName.Equals("Hashes", StringComparison.CurrentCultureIgnoreCase) // Let's keep the users custom hashes in tact - && Directory.Exists(Path.Combine(folderDir, dirName + @"\"))) - { - Directory.Delete(Path.Combine(folderDir, dirName + @"\"), true); - } +// Zip not needed anymore +File.Delete(downloadFilename + ".zip"); - Directory.Move(dir, Path.Combine(folderDir, dirName + @"\")); - } - foreach (string file in Directory.GetFiles("master/")) - { - if (file.Contains("Updater.exe") || file.Contains("Updater.exe.config") - || file.Contains("Updater.pdb") || file.Contains("Octokit.dll")) - continue; +// If the "-b" or "--boot" option was passed, launch the extracted application +if (args.Contains("-b") || args.Contains("--boot")) +{ + Console.WriteLine("Booting..."); + Process.Start(Path.Combine(Path.GetDirectoryName(Environment.ProcessPath), "Toolbox.exe")); +} - SetAccessRule(file); - SetAccessRule(folderDir); +if (args.Contains("-e") || args.Contains("--exit")) +{ + Console.WriteLine("\nPress any key to continue..."); + Console.Read(); +} - if (File.Exists(Path.Combine(folderDir, Path.GetFileName(file)))) - { - File.Delete(Path.Combine(folderDir, Path.GetFileName(file))); - } - File.Move(file, Path.Combine(folderDir, Path.GetFileName(file))); - } - } +bool updateNeeded(ZipArchive archive) +{ + // Get the ZipArchiveEntry for the Toolbox.exe file + ZipArchiveEntry entry = archive.GetEntry("Toolbox.exe"); - static void SetAccessRule(string directory) - { - System.Security.AccessControl.DirectorySecurity sec = System.IO.Directory.GetAccessControl(directory); - FileSystemAccessRule accRule = new FileSystemAccessRule(Environment.UserDomainName + "\\" + Environment.UserName, FileSystemRights.FullControl, AccessControlType.Allow); - sec.AddAccessRule(accRule); - } + if (entry != null) + { + // Construct the target path for the extracted file + string targetPath = Path.Combine(currentDir, entry.FullName); - static void Download(string CompileDate) + // Check if the file already exists + if (File.Exists(targetPath)) { - foreach (Release latest in releases) - { - Console.WriteLine("Checking Update"); - if (!foundRelease) - { - if (!latest.Assets[0].UpdatedAt.ToString().Equals(CompileDate)) - { - Console.WriteLine("Downloading release..."); - bool IsDownloaded = DownloadedProgram(latest); + // Get the last modified time of the file in the zip archive and on disk + DateTime lastWriteTimeZip = entry.LastWriteTime.DateTime; + DateTime lastWriteTimeFile = File.GetLastWriteTime(targetPath); - if (IsDownloaded) - Console.WriteLine("Downloaded update successfully!"); - else - Console.WriteLine("Failed to download update!"); - } - } - foundRelease = true; - } - } - static bool DownloadedProgram(Release release) - { - return DownloadRelease("master", - release.Assets[0].BrowserDownloadUrl, - release.TagName, - release.Assets[0].UpdatedAt.ToString(), - release.TargetCommitish); - } - static bool DownloadRelease(string downloadName, string url, string ProgramVersion, string CompileDate, string CommitInfo) - { - try + // If the modified time of the file in the zip archive is greater than the modified time on disk, + // an update is needed + if (lastWriteTimeZip > lastWriteTimeFile) { - using (var webClient = new WebClient()) - { - webClient.DownloadFile(url, downloadName + ".zip"); - } - if (Directory.Exists(downloadName + "/")) - Directory.Delete(downloadName + "/", true); - ZipFile.ExtractToDirectory(downloadName + ".zip", downloadName + "/"); - - //Zip not needed anymore - File.Delete(downloadName + ".zip"); - string versionTxt = Path.Combine(Path.GetFullPath(downloadName + "/"), "Version.txt"); - - using (StreamWriter writer = new StreamWriter(versionTxt)) - { - writer.WriteLine($"{ProgramVersion}"); - writer.WriteLine($"{CompileDate}"); - writer.WriteLine($"{CommitInfo}"); - } return true; } - catch (Exception ex) - { - Console.WriteLine($"Failed to download update! {ex.ToString()}"); - return false; - } - } - static async Task GetReleases(GitHubClient client) - { - List Releases = new List(); - foreach (Release r in await client.Repository.Release.GetAll("KillzXGaming", "Switch-Toolbox")) - Releases.Add(r); - releases = Releases.ToArray(); + // The file is already up-to-date + Console.WriteLine($"{entry.Name} is up-to-date, skipping extraction."); + return false; } + // The file doesn't exist on disk, so an update is needed + return true; } -} + + // If the Toolbox.exe file isn't found in the archive, assume an update is needed + return true; +} \ No newline at end of file diff --git a/Updater/Properties/AssemblyInfo.cs b/Updater/Properties/AssemblyInfo.cs deleted file mode 100644 index 9a8c9c462..000000000 --- a/Updater/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Updater")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Updater")] -[assembly: AssemblyCopyright("Copyright © 2018")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("d82a2c08-2a65-43af-bda6-a36cc27aa003")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Updater/Properties/app.manifest b/Updater/Properties/app.manifest deleted file mode 100644 index 3b5ed3da3..000000000 --- a/Updater/Properties/app.manifest +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Updater/Updater.csproj b/Updater/Updater.csproj index 0b7b99956..eaebf54bb 100644 --- a/Updater/Updater.csproj +++ b/Updater/Updater.csproj @@ -1,68 +1,27 @@ - - - - - Debug - AnyCPU - {D82A2C08-2A65-43AF-BDA6-A36CC27AA003} - Exe - Updater - Updater - v4.8 - 512 - true - true - - - - AnyCPU - true - full - false - ..\Toolbox\bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - ..\Toolbox\bin\Release\ - TRACE - prompt - 4 - - - LocalIntranet - - - true - - - Properties\app.manifest - - - - ..\Toolbox\Lib\Octokit.dll - - - - - - - - - - - - - - - - - - - - + + + net7.0-windows + Exe + false + enable + + + ..\Toolbox\bin\Debug\ + + + ..\Toolbox\bin\Release\ + + + LocalIntranet + + + true + + + Updater + Updater + Copyright © 2023 + 1.0.0.0 + 1.0.0.0 + \ No newline at end of file