Laden...

Forenbeiträge von dannoe Ingesamt 251 Beiträge

05.11.2023 - 21:51 Uhr

Es wäre zwar auch mit WPF möglich, aber wenn du einfach nur ein Herunterfahren/Abmelden mitbekommen willst, dann reicht dir eventuell das hier:

Application.SessionEnding Event (System.Windows)

30.10.2023 - 18:27 Uhr

Ist der recipientim globalen Addressbuch versteckt? (siehe https://stackoverflow.com/a/45980562/1627022)

Hat der Benutzer der das Programm ausführt auch wirklich die Berechtigung das Postfach des recipientauszulesen?

07.10.2023 - 19:03 Uhr
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="7.0.0" />

Server Version: 10.5.19-MariaDB-0+deb11u2
Ich hab keinen ValueConverterund auch keinen Aufruf von .HasConversionim Modell. Zeig mal dein aktuelles Modell.

06.10.2023 - 22:13 Uhr

Ich erhalte in meinem Testprojekt sofort diese Meldung:

Unhandled exception. System.InvalidCastException: 
Unable to convert MySQL date/time to System.DateTime, set AllowZeroDateTime=True or ConvertZeroDateTime=True in the connection string. See https://mysqlconnector.net/connection-options/

Wenn ich das dann mache, funktioniert es.
Testprojekt:

CREATE TABLE `table` (
    `Id` INT(11) NULL DEFAULT NULL,
    `Date` DATE NULL DEFAULT NULL,
    `DateTime` DATETIME NULL DEFAULT NULL
)
INSERT INTO table (Id, Date, DateTime) VALUES
(1, '0000-00-00', '0000-00-00 00:00:00'),
(2, '2023-10-06', '2023-10-06 21:30:00');
public partial class Table
{
    public int? Id { get; set; }

    public DateOnly? Date { get; set; }

    public DateTime? DateTime { get; set; }
}
public partial class TestContext : DbContext
{
    public TestContext()
    {
    }

    public TestContext(DbContextOptions<TestContext> options)
        : base(options)
    {
    }

    public virtual DbSet<Table> Tables { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
                .UseMySql("server=localhost;user=root;database=test;ConvertZeroDateTime=True",       
                          Microsoft.EntityFrameworkCore.ServerVersion.Parse("10.5.19-mariadb"));

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder
            .UseCollation("utf8mb4_general_ci")
            .HasCharSet("utf8mb4");

        modelBuilder.Entity<Table>(entity =>
        {
            entity
                .HasNoKey()
                .ToTable("table");

            entity.Property(e => e.DateTime).HasColumnType("datetime");
            entity.Property(e => e.Id).HasColumnType("int(11)");
        });

        OnModelCreatingPartial(modelBuilder);
    }

    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
using var db = new TestContext();
var test = db.Tables
    .First();
06.08.2023 - 14:18 Uhr

Es gibt unzählige Webseiten mit denen man Reguläre Ausdrücke testen kann, z. B. auch https://regex101.com/.
Verwende ich gerne, da man sich damit direkt ein Codeschnipsel in C# generieren kann.

Und um kurze C# Codeschnipsel zu testen kannst du z. B. https://dotnetfiddle.net/ oder https://sharplab.io/ verwenden.

06.08.2023 - 12:08 Uhr

Dein Regex funktioniert bei mir:

using System;
using System.Text.RegularExpressions;
    
public class Program
{
    public static void Main()
    { 
        string input = "ab1998ist 2000gg1898";
        var regex = new Regex("(?:(?:18|19|20)[0-9]{2})");
        var matches = regex.Matches(input);
        foreach(var match in matches)
        {
            Console.WriteLine(match);
        }
    }
}

Ausgabe:

1998
2000
1898
08.07.2023 - 20:14 Uhr

Vielleicht versteh ich es nicht ganz, aber wenn du nur eine ID und ein Wert hast, dann sieht die Ausgabe (mit identischer Implementierung) so aus:

ConsoleApp2.exe --id 1 --value a
(1, a)

Oder so, wenn du zwei mal die gleiche ID mit unterschiedlichen Werten brauchst:

ConsoleApp2.exe --id 1 --value a --id 1 --value b
(1, a)
(1, b)

Falls ich es nicht verstanden habe, bitte ich um ein komplexeres Beispiel von dir 😄

08.07.2023 - 17:07 Uhr

Ist zwar jetzt nicht super schön, aber funktioniert.
Der Fehlerfall (ids.Length != values.Length) sollte behandelt werden, sonst ignoriert er einfach Werte.

using System.CommandLine;

var idOption = new Option<int[]>("--id")
{
    AllowMultipleArgumentsPerToken = true,
    Arity = ArgumentArity.ZeroOrMore
};
var valueOption = new Option<string[]>("--value")
{
    AllowMultipleArgumentsPerToken = true,
    Arity = ArgumentArity.ZeroOrMore
};
var blaOption = new Option<string>("--bla");
var fooOption = new Option<string>("--foo");
var barOption = new Option<bool>("--bar");

var rootCommand = new RootCommand();
rootCommand.Add(idOption);
rootCommand.Add(valueOption);
rootCommand.Add(blaOption);
rootCommand.Add(fooOption);
rootCommand.Add(barOption);

rootCommand.SetHandler((ids, values) =>
    {
        var pairs = ids.Zip(values, (k, v) => new Tuple<int, string>(k, v)).ToArray();
        foreach (var kvPair in pairs)
            Console.WriteLine(kvPair);
    },
    idOption, valueOption);

await rootCommand.InvokeAsync(args);

Ausgabe

ConsoleApp2.exe --foo x --id 1 --value a --bar true --id 2 --bla y --value b
(1, a)
(2, b)
07.07.2023 - 13:31 Uhr

Du setzt das SelectedViewModel in deiner LoginVM und nicht in der BasicWindowVM.

28.06.2023 - 19:03 Uhr

Es gibt ein experimentelles Framework/eine Bibliothek von Steve Sanderson. Das ist genau das, was du brauchst:

https://github.com/SteveSandersonMS/DotNetIsolator

https://www.youtube.com/watch?v=gxplZcW5t3Y

Aber es ist (noch?!) EXPERIMENTELL und ich würde das nicht in einer Produktivumgebung einsetzen.

03.05.2023 - 21:39 Uhr

Zitat von Palladin007

Ich habe es mit Microsoft.CodeAnalysis.CSharp versucht, allerdings ist das derart komplex, dass ich lieber den guten alten TextWriter nutze 😄

Für Microsoft.CodeAnalysis.Csharp gibt es http://roslynquoter.azurewebsites.net/ 
Kennst du das schon? Damit kannst du im Grunde den Code vorgeben und er generiert dir die Anweisungen dafür.

18.04.2023 - 09:58 Uhr

siehe Use functionality from NuGet packages

Dazu muss dein Source Generator aber als NuGet Package verpackt sein.

14.04.2023 - 18:31 Uhr

Mir sind noch zwei Probleme aufgefallen:

  • Das Ankündigungsforum ist bei mir in der Forenübersicht so markiert, als gäbe es noch etwas Neues. Ich habe alle Seiten durchgesehen und kein ungelesenes Thema gefunden. (siehe Screenshot)
  • Wenn ich in einem Forum auf "Frage stellen" klicke, wird die im ersten Punkt erwähnte Markierung sofort gesetzt auch wenn ich dann kein Thema erstelle. Ich weiß nicht, ob der vorherige Punkt eventuell auch davon kommt, weil ich einfach mal "Frage stellen" im Ankündigungs-Bereich gedrückt habe. (Vermutlich am 2. April um den neuen Editor zu testen)
    • Nachträgliche Ergänzung: Der Punkt des Bereichs "Wünsch und Kritik" ist nach meinem Beitrag wieder richtig markiert.

Und einen Wunsch gibt es auch noch:

  • Ein "Alle Themen als gelesen markieren" Knopf/Link für Unterforen
    • Es gibt einige Unterforen, in denen es noch viele ungelesene Beiträge gibt, aber ich habe keine Lust, mehrere Seiten durchzugehen, nur um alles als gelesen zu markieren.
02.04.2023 - 18:47 Uhr
  • (Bug) Der Link zu den Kommentaren funktioniert auf der Hauptseite (https://mycsharp.de/) nicht (siehe Screenshot)
    • Es passiert einfach nichts beim Klick darauf
  • (Bug) Die Schrift im neuen Editor ist mit Dark Mode nicht lesbar.
    • Die Schriftfarbe ist dann weiß auf weißem Hintergrund.
  • (Wunsch) Es wäre schön, wenn man Screenshots bzw. Bilder direkt mit Copy&Paste einfügen könnte. (dann muss man den Screenshot nicht extra als Datei speichern um ihn hochzuladen)
  • (Wunsch) Mehrere Anhänge pro Beitrag wären auch nice-2-have
  • (Wunsch) Es sollte eine Rückfrage geben, ob man die Seite wirklich verlassen möchte, wenn die aktuelle Seite einen Editor hat, der Änderungen beinhaltet.
  • (Bug) Die "Aktive Themen" Übersicht zeigt Themen weiterhin als "Neue Beiträge!" obwohl ich sie besucht habe. (Selbst in diesem Thema, obwohl es für mich nichts Neues gibt)
30.01.2023 - 13:37 Uhr

Wenn du die History aus einem Workspace willst, musst du dir den Workspace im "workspaceStorage" Ordner raus suchen ansonsten nimmst du "globalStorage". Dort findest du dann eine state.vscdb Datei. Das ist eine SQLite Datenbank die du mit einem beliebigen Tool für SQLite auslesen kannst. In der ItemTable Tabelle findest du dann einen Eintrag mit workbench.search.history und dort findest du deine History im JSON-Format.

22.12.2022 - 22:40 Uhr

Greed (Gier): Standardmäßig versuchen die Quantoren *, ?, +, und {min,max}, so viele Zeichen wie möglich einzubeziehen, um eine Übereinstimmung zu finden. Um dieses Verhalten auf so wenig Zeichen wie möglich zu begrenzen, fügen Sie nach den Quantoren ein Fragezeichen an. Zum Beispiel bedeutet das Suchmuster <.+> (das kein Fragezeichen enthält): "Suche nach einem <, gefolgt von 1 oder mehr Zeichen, gefolgt von einem >". Um zu verhindern, dass das Suchmuster die komplette Zeichenkette <em>text</em> findet, fügen Sie nach dem Pluszeichen ein Fragezeichen an: <.+?>. Dies führt dazu, dass die Übereinstimmung bereits beim ersten '>' endet und dementsprechend nur der erste HTML-Tag <em> gefunden wird.

22.12.2022 - 21:06 Uhr

Fragezeichen hinter das Sternchen:


<tr>[\s\S]*?<\/tr>


21.12.2022 - 17:33 Uhr

Versuch es mal mit:


var portfwd = new ForwardedPortLocal("127.0.0.1", 3306, "127.0.0.1", 3306);

oder


var portfwd = new ForwardedPortLocal(IPAddress.Loopback.ToString(), 3306, "127.0.0.1", 3306);

06.12.2022 - 19:54 Uhr

Mit "abgesichert" meinte ich nicht nur das Konfigurieren und Benutzen von SSL, sondern eher dass der Sender des Befehls auch entsprechend authentifiziert und autorisiert ist. Was von Serverseite geprüft werden muss.

Wenn man es abstrakt sieht, dann ist HTTP(S) auch nur ein Protokoll wie SSH. Jeder SSH Daemon führt dir nach entsprechender Authentifizierung und Autorisierung jegliche Befehle auf dem System aus.

06.12.2022 - 19:17 Uhr

Ein Programm, dass eine HTTP-Nachricht direkt in einer Shell ausführt, wäre allerdings ein krasses Sicherheitsrisiko.

Ein Sicherheitsrisiko ist es nur, wenn der HTTP(S)-Endpunkt nicht entsprechend abgesichert ist.

Aber muss es HTTP sein oder warum nicht einfach SSH?

06.12.2022 - 19:14 Uhr

Eine Möglichkeit:

  • Packe alles in eine Funktion mit Rückgabewert Boolean und die Zahl als Parameter vom Typ Integer
  • Zahl in einen String verwandeln
  • Erstes Zeichen aus dem String extrahieren
  • In einer Schleife jedes weitere Zeichen des Strings mit dem ersten Zeichen vergleichen
  • Bei Ungleichheit direkt die Funktion mit "return false" verlassen
  • Wenn die Schleife durchläuft müssen alle Ziffern gleich sein oder es gibt nur eine Ziffer, also die Funktion mit "return true" verlassen;
07.11.2022 - 13:56 Uhr

Es handelt sich bei dem Projekt A um eine Serveranwendung die früher als WinForms-Anwendung umgesetzt wurde. Die Möglichkeit zur Konfiguration bzw. Überwachung der Anwendung wurde damals direkt im gleichen Projekt mit WinForms umgesetzt. Die Serveranwendung stellt einen TCP Server zur Verfügung mit dem sich Clients verbinden können. (Heute würden wir das als HTTP-Schnittstelle umsetzen.)

Irgendwann kam die Anforderung dass die Anwendung als Windows Dienst laufen soll. Es wurden also alle WinForms-Referenzen entfernt und eine Konsolenanwendung daraus.
Die Möglichkeit zur Konfiguration und Überwachung flog raus. Später kam diese Anforderung dann aber wieder: Es wurde eine Web API entwickelt und Projekt B ist entstanden. Die Web API wird dann von einer kleinen SPA angesprochen, die selbst von dem Projekt B gehostet wird. (Die SPA ist meine statische index.html Datei)

Projekt A soll bei Bedarf aber auch ohne Projekt B lauffähig sein. Projekt B wird auch niemals im IIS oder als Azure Web App Service gehostet, sondern immer in einer Konsolenanwendung.

07.11.2022 - 10:35 Uhr

Hallo zusammen,

folgendes Szenario:

Projekt A (Console App) hat eine Abhängigkeit auf Projekt B (ASP.NET Core Web API).
Projekt B hat einen wwwroot Ordner mit einer einzelnen index.html. Diese Datei soll mit in das Ausgabeverzeichnis kopiert werden.

Mit dem folgenden Problem:

Ohne Publish funktioniert es korrekt: Der wwwroot Ordner wird inklusive Inhalt in das Ausgabeverzeichnis kopiert.
Sobald ich versuche das Projekt A zu publishen, erhalte ich im Ausgabeverzeichnis bzw. Publishverzeichnis den wwwroot Ordner nicht.

Aus dem Bauch heraus hätte ich jetzt erwartet, dass er hier auch den wwwroot Ordner von Projekt B publishen sollte.
Im Anhang findet ihr ein Beispielprojekt. Kann mit folgenden Befehl getestet werden:

dotnet publish -c Release

PS: Wenn ich das Projekt B selbst publishe, dann funktioniert es.

26.09.2022 - 16:52 Uhr

Wenn ich bei mir die Properties/Eigenschaften offen habe, dann gibt es bei mir ganz oben ein DropDown-Feld. Dort kann ich alle Controls auswählen und sehe dann auch die "Auswahl" im Designer.

16.09.2022 - 17:09 Uhr

@BerndFfm
Mit diesem Code ist es aber immer noch möglich, dass ich Text in die Textbox einfügen kann. (entweder mittels Rechtsklick/Einfügen oder Strg+V)

09.09.2022 - 10:14 Uhr

Bau doch mal ein Debugger.Launch ein und versuch den Fehler zu debuggen.
Ich vermute eine ungefangene Exception oder so etwas. Vielleicht mit falschen Pfaden, da der Dienst ein anderes Arbeitsverzeichnis hat als die "normal" ausgeführte Datei.

25.08.2022 - 16:17 Uhr

Mit der folgenden Methode XmlNode.SelectSingleNode Method (System.Xml)(system-string) und dem folgenden XPath:


//Property[@name='Projektbeschreibung']

Komplettes Beispiel in der Microsoft Dokumentation: XmlDocument Class (System.Xml) (Find nodes)

26.07.2022 - 14:08 Uhr

Kann ich bei mir nicht nachvollziehen. Wenn ich dein Code Snippet ausführe:


0.05
0.10
0.15
0.20
0.25
0.30
0.35
0.40
0.45
0.50
0.55
0.60
0.65
0.70
0.75
...

21.07.2022 - 10:41 Uhr

Genauso wie du die Size beim Erstellen der Form übergibst, kannst du natürlich auch mit


Size myFormSize = form.Size;

die Size wieder auslesen.

Anschließend kannst du wieder über Zugriff auf myFormSize die Width auslesen:


int currentWidth = myFormSize.Width;

Du kannst aber auch ohne das Size struct zwischenzuspeichern den Wert auslesen:


int currentWidth = form.Size.Width;

21.07.2022 - 10:23 Uhr

Form.Size Property (System.Windows.Forms)

Dadurch erhältst du eine Instanz des Size structs und dieses enthält dann Width und Height der Form.

PS: Googlen ist in solchen Fällen meistens schneller als einen Beitrag im Forum zu eröffnen. Mit der Google Suchanfrage "form width docs microsoft c#" ist die von mir verlinkte Seite, zumindest bei mir, das erste Ergebnis.

30.06.2022 - 08:19 Uhr

Es wäre gut, wenn du etwas (gekürzten) Code und Beispiele für das JSON zeigen könntest.

26.06.2022 - 19:54 Uhr

Mit deinem aktuellen Vorgehen müsste "localtime" ein Key-Value Paar des Root-Objekts sein. Es ist liegt aber unterhalb von "location":


{
    "location": {
//        ...
        "localtime": "2022-06-26 18:48"
    },
    "current": {
//        ...
    }
}

Du musst das so auch in deinen C# Klassen abbilden:


public class Rootobject
{
    public Location location { get; set; }
}

public class Location
{
    public string localtime { get; set; }
}

Das kann Visual Studio automatisch für dich machen, wenn du den folgenden Menüpunkt aufrufst, während dein JSON in der Zwischenablage liegt: Edit - Paste Special - Paste JSON as Classes

PS: Es ist hilfreich für die Leute im Forum, wenn man bei solchen Fragen das zugehörige JSON zur Verfügung stellt.

Edit:
@T-Virus: Die Doku der Api ist nicht wirklich schön. Ich habe zumindest auf die schnelle kein komplettes Beispiel gefunden und deswegen schnell einen Wegwerf-Account erstellt. Aber nachträglich habe ich jetzt in der Doku unter "Location" gelesen:

Location Object

Location object is returned with each API response. [...]

25.06.2022 - 11:56 Uhr

Die von dir gepostete Webseite fragt beim Laden eine API an und tauscht dann on-the-fly den Downloadlink gegen die Antwort der API aus.
So könntest du das in C# abbilden:


using System.Text;
using System.Text.Json;

public class Program
{
    public static async Task Main()
    {
        var data = new
        {
            ConfigId = "pc6axfs",
            Version = 15,
            IsCustomModule = true,
            Subdomain = 1,
            ConnectionId = ""
        };

        string jsonData = JsonSerializer.Serialize(data);

        HttpClient client = new();
        // User-Agent muss gesetzt sein, sonst kommt ein 404 von der API zurück, wird zur Bestimmung des OS verwendet
        client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Microsoft Windows 10)"); 

        var response = await client.PostAsync(
            "https://get.teamviewer.com/api/CustomDesign", // ob du die API verwenden darfst kann ich dir nicht sagen, ist nicht offiziell von Teamviewer dokumentiert
            new StringContent(jsonData, Encoding.UTF8, "application/json"));
        
        var contents = await response.Content.ReadAsStringAsync(); // hier steht deine Download-URL drin, aber mit führenden und nachgestellten Anführungszeichen
		
        Console.WriteLine(contents);
    }
}


14.06.2022 - 13:35 Uhr

Bei System.Text.Encoding. stehen mir ja nur ein paar Typen zur Verfügung wie UTF8, 16, Unicode etc.

Da gibt es noch viel mehr und genau dafür gibt es die Dokumentation:

Encoding Klasse (System.Text)

03.06.2022 - 18:15 Uhr

Du kannst das JSON in die Zwischenablage nehmen und dann in Visual Studio über Edit - Paste Special - Paste JSON as Classes (siehe Screenshot) einfügen.
Visual Studio erstellt dir dann automatisch Klassen dafür.

Anstatt dynamic kannst du dann deine konkrete Klasse als Typ verwenden:


var myJsonObject = System.Text.Json.JsonSerializer.Deserialize<MyJsonObject>(jsonAsString);

20.05.2022 - 14:48 Uhr

Dann ist das y-Projekt im neuen SDK-Format. (siehe Übersicht: .NET SDKs für Projekte (Projektdateien))
Ich vermute, dass MsBuild die Projektdatei dann an "dotnet build" übergeben möchte und deswegen auf einen Fehler stößt, weil das .NET SDK nicht installiert ist.
Warum der manuelle Aufruf durch die Kommandozeile funktioniert, könnte folgende Unterschiede haben:

  • Unterschiedliche MsBuild Versionen (z. B. durch unterschiedliche PATH Variablen bei Jenkins vs. Benutzer)
  • Umgebungsvariablen die das Verhalten von MsBuild steuern

Kann sonst nicht wirklich weiterhelfen, aber vielleicht hilft das beim Recherchieren.

PS: Als Workaround könntet ihr natürlich auch einfach das .NET SDK auf der Jenkins Maschine installieren.

20.05.2022 - 14:18 Uhr

Sind beides .NET Framework Projekte? Oder ist eines vielleicht ein .NET Core/5/6/Standard Projekt?

Kenn mich mit Jenkins nicht aus, aber gibt es da kein Debug Mode, damit die Aufrufe inkl. Parameter im Log landen?

20.05.2022 - 09:18 Uhr

Bist du dir sicher, dass deine Pfadangabe stimmt? Aus Versehen den falschen Pfad kopiert?
Hat die DLL vielleicht andere Abhängigkeiten die nicht aufgelöst werden können? -> Dependency Walker

Ansonsten könntest du in der Installationsroutine deiner Software, nach der Drittanbieter Software suchen (vielleicht trägt die sich in die Registry ein?) und dann einen Symlink in deinem Installationsordner erstellen der auf die Assembly der Drittanbieter Software zeigt.

18.05.2022 - 08:59 Uhr

Also ich lese auf der Webseite "TRY 30 DAYS FREE" und "START FOR FREE"

13.05.2022 - 20:56 Uhr

Im Übrigen werden die Methoden durch ihr Präfix im Editor bei der Codevervollständigung alle schön gebündelt angezeigt. Auch ein Vorteil.

Sofern du die Methoden manuell aufrufst dann stimmt das. Ich bin davon ausgegangen, dass du die Methoden nur via Reflection aufrufst.

Für diesen einen Fall nutzen uns die Attributen leider nichts: [...]

Warum die Attribute dabei nichts nutzen sollen, hast du aber nicht beschrieben.

Nach deiner ausführlicheren Beschreibung, würde ich es jetzt so umsetzen:


[File("Parts_22")]
public class FilePostProcessor_Parts_22 : BaseProcessor
{
    [PostProcess("PartNumber")]
    public static bool TransformPartNumberIntoXyz() 
    {
        // do something
    }

    [PostProcess("Art2NoH")]
    public static bool TransformArt2NoHIntoZyx() 
    {
        // do something
    }
}

BaseProcess ist deine Basisklasse mit der gemeinsamen Funktionalität.
Ein weiterer Vorteil wenn du die Attribute verwendest:

  • Du kannst einen Roslyn Analyzer bauen, der bei vorhandenem PostProcess Attribute die Methodensignatur erzwingt.
  • Du kannst zur Runtime überprüfen ob alle Methoden die das Attribute haben, auch die richtige Signatur haben.
    In deinem Fall kann es schnell passieren, dass eine Signatur falsch ist und das fällt dann fast nicht auf. (Außer dass die Nachverarbeitung des Feldes nicht stattfindet)

Ich hab das jetzt nur der Vollständigkeit halber geschrieben. Vielleicht hat mal jemand ein ähnliches Problem und sucht etwas Inspiration.

13.05.2022 - 19:42 Uhr

Wenn es einen guten Grund gibt, dass die Methoden static sind, dann muss er aber noch etwas warten. Static Interface Member sind erst in der Preview.

13.05.2022 - 19:10 Uhr

Also ich würde lieber das hier wählen


public class KlasseA
{
    [PostProcess("PartNumber")] // 
    public static bool TransformPartNumberIntoXyz() 
    {
           // Methode hat einen sprechenden Namen bzw. es ist möglich ihr einen sprechenden Namen zu geben
           // Standard .NET Namenskonventionen wurden eingehalten
    }
}

statt diesem


public class KlasseA
{
    public static bool nvPartNumber() 
    {
           // nv steht vermutlich für Nachverarbeitung (Englisch und Deutsch gemischt 👎)
    }
}

06.05.2022 - 09:37 Uhr

Verwendest du .NET Framework? Maximale Objektgröße ist dort standardmäßig (auch in 64 Bit) 2 GB

Versuch mal in der app.config:


<configuration>
  <runtime>
    <gcAllowVeryLargeObjects enabled = "true" />
  </runtime>
</configuration>

04.05.2022 - 11:06 Uhr

Ist es eine Anforderung, dass die Dateien nicht verändert werden? Wenn nicht, könntest du auch Meta-Informationen mit z.B. exif in die Dateien schreiben.
Wenn du dann einfach eine GUID in die Meta-Informationen der Datei schreibst, kannst du die GUID verwenden um Sie mit deinen Informationen zu verknüpfen.

22.04.2022 - 08:39 Uhr

Ich weiß nicht ob ich dein Bedenken richtig verstanden habe, aber:

Du hast im State noch den Zähler, d.h. wenn zwei identische Objekte freigeben wollen, dann ist der Zähler auch auf 2 und muss erst auf 0 fallen, bevor ein anderes Objekt mit EnterAsync "eintreten" darf. D.h. bevor nicht jedes Objekt A den Zähler dekrementiert (und somit freigegeben) hat, kann auch kein Objekt B in den Channel kommen.

19.04.2022 - 16:05 Uhr

mit xPath z. B. so:


xDoc.SelectSingleNode("order/props/@version").Value