lima-city: Webhosting, Domains und Cloud
0 Pluspunkte 0 Minuspunkte

Ich habe diesen C# Code

Console.WriteLine("[info] Vergleiche installierte und verfügbare Versionen...\n");
foreach (var installed in installedPackages)
{
   var repoPkg = repoPackages.FirstOrDefault(r => r.Id.Equals(installed.Id, StringComparison.OrdinalIgnoreCase));
   if (repoPkg != null)
   {

	   var latestRepoVersion = repoPkg.AvailableVersions.OrderByDescending(v => new Version(v)).FirstOrDefault();

	   if (latestRepoVersion != null && IsNewerVersion(latestRepoVersion, installed.Version))
	   {
		   Console.Write($"{installed.Name} ");
		   Console.ForegroundColor = ConsoleColor.Red;
		   Console.Write($"{installed.Version} ");
		   Console.ResetColor();
		   Console.Write("<");
		   Console.ForegroundColor = ConsoleColor.Green;
		   Console.WriteLine($" {latestRepoVersion}\n");
		   Console.ResetColor();

		   //await CheckVulnerabilities(installed.Name, installed.Version);

		   Console.WriteLine("\tVerfügbare Updates:");

		   updatesAvailable = true;   
		   string base_url = "https://raw.githubusercontent.com/microsoft/winget-pkgs/refs/heads/master/manifests/";
		   string firstLetter = repoPkg.Id.Substring(0, 1).ToLower();
		   string id = repoPkg.Id.Replace(".", "/"); // Main.Sub => Main/Sub
		   string version = repoPkg.AvailableVersions[0];
		   string finalURL = base_url + firstLetter + "/" + id + "/" + version + "/" + repoPkg.Id + ".installer.yaml";
		   string yamlContent = String.Empty;
		   try
		   {
			   yamlContent = await DownloadYamlAsync(finalURL);
		   } catch(Exception e) {
			   Console.WriteLine("[error] YAML Manifest konnte nicht heruntergeladen werden");
		   }
		   List<(string Architecture, string InstallerUrl)> installerData = ExtractInstallerData(yamlContent);
		   foreach (var data in installerData)
		   {
			   Console.WriteLine($"\t{data.Architecture}: {data.InstallerUrl}");
			   if(data.Architecture == arch)
			   {
				   //await InstallPackageAsync(data.InstallerUrl);
			   }
		   }

		   Console.WriteLine("");

	   }
	   else if (latestRepoVersion == null)
	   {
		   Console.WriteLine($"[info] Keine Version im Repository für {installed.Name}.");
	   }
	   else
	   {
		   upToDatePackages.Add($"{installed.Name} {installed.Version} >= {latestRepoVersion}");
	   }
   }
}

Wenn ich das Programm ausführe wird die Zeile

[info] Vergleiche installierte und verfügbare Versionen...

noch angezeigt aber danach kommt eine Fehlermeldung

Unhandled exception. System.FormatException: The input string '50f1' was not in a correct format.
   at System.Number.ThrowFormatException[TChar](ReadOnlySpan1 value)
   at System.Version.ParseVersion(ReadOnlySpan1 input, Boolean throwOnFailure)
   at System.Version.Parse(String input)
   at System.Version..ctor(String version)
   at Program.<>c.<Main>b__11_4(String v) in C:\Users\thomas\source\repos\Z-Patcher\Z-Patcher\Program.cs:line 212
   at System.Linq.CachingComparer2.SetElement(TElement element)
   at System.Linq.OrderedEnumerable1.TryGetFirst(Boolean& found)
   at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable1 source, Boolean& found)
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable1 source)
   at Program.Main(String[] args) in C:\Users\thomas\source\repos\Z-Patcher\Z-Patcher\Program.cs:line 212
   at Program.<Main>(String[] args)

Woher kommt der Fehler genau und wie kann ich das fixen?

von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

Die Fehlermeldung besagt dass das Programm versucht einen ungültigen Versionsstring (z. B. 50f1) mit new Version(string) oder Version.Parse() zu verarbeiten. Diese Methoden erwarten aber nur numerische Versionen wie 1.2.3 oder 4.0. Das Problem liegt in

var latestRepoVersion = repoPkg.AvailableVersions
    .OrderByDescending(v => new Version(v)) <-- new Version(v)
    .FirstOrDefault();

Du kannst nur gültige Versionsstrings zulassen

var validVersions = repoPkg.AvailableVersions
    .Where(v =>
    {
        bool valid = Version.TryParse(v, out _);
        if (!valid)
            Console.WriteLine($"[warn] Ungültige Version übersprungen: {v}");
        return valid;
    });

var latestRepoVersion = validVersions
    .OrderByDescending(v => new Version(v))
    .FirstOrDefault();
von (714 Punkte)  
Diese Community basiert auf dem Prinzip der Selbstregulierung. Beiträge werden von Nutzern erstellt, bewertet und verbessert – ganz ohne zentrale Moderation.

Wer hilfreiche Fragen stellt oder gute Antworten gibt, sammelt Punkte. Mit steigender Punktzahl erhalten Mitglieder automatisch mehr Rechte, zum Beispiel

  • Kommentare verfassen
  • Beiträge bewerten
  • Inhalte bearbeiten
  • Inhalte ausblenden

So entsteht eine Plattform, auf der sich Qualität durchsetzt – getragen von einer engagierten Gemeinschaft. Unser Ziel: Guter Inhalt. Für alle.

2.3k Fragen

2.8k Antworten

260 Kommentare

12 Nutzer