Laden...
T
T-Virus myCSharp.de - Experte
Entwickler noobie :D Nordhausen, Nörten-Hardenberg Dabei seit 17.04.2008 2.224 Beiträge
Benutzerbeschreibung

Forenbeiträge von T-Virus Ingesamt 2.224 Beiträge

05.09.2023 - 13:42 Uhr

Ohne irgendwelche Informationen kann dir dabei keiner helfen.
Lies mal deinen Beitrag und stell dir die Frage, wie jemand ohne Wissen über deine Anwendung was dazu schreiben soll.
Ohne grundlegende Informationen was du für Einstellungen hast, wo die herkommen und wo die ggf. wieder gespeichert werden soll, hat man keine Informationen.

Bitte liefere die mal nach, sonst wird es schwer hier irgendwas brauchbares sagen zu können.

T-Virus

30.08.2023 - 15:17 Uhr

Mit Strings solltest du da nicht arbeiten.
Wenn du deine Einträge im Enum mal umbenennst, funktionieren diese nicht mehr bzw. hast du plötzlich unbekannte Werte in der DB.

Im Endeffekt sieht das aber nach einem Enum ohne Flags aus.
In dem Fall reicht die Speicherung der Werte in einer Spalte.
Da diese nicht dynamisch, also z.B. durch Benutzer angelegt/verwaltet werden, reicht hier eine int Spalte für den Wert.

T-Virus

30.08.2023 - 14:37 Uhr

Die Beschreibung sagt aktuell nicht viel aus bzw. ist diese nicht verständlich.
Über was für Werte sprechen wir hier?
Wenn du in deinem Code einfach Enums hast, dann kannst du die Werte einfach in einer int Spalte speichern.

Wenn die Werte dann auch Verknüpft sind, dann hast du ein Enum mit Flags Markierung.
Dabei werden die Werte im Code auf Bit Ebene Verknüpft und landen in einem Feld.
Beim auslesen muss dann nur der Int wieder in das Enum umgewandelt werden.

Oder meinst du mit festen Werten, dass diese in einer anderen Tabelle hinterlegt und in einer zweiten referenziert werden?
Dann musst du, wie von dir schon bemerkt, über eine ID auf die erste Tabelle verweisen.
Hier wäre eine klarere Beschreibung hilfreicher.

T-Virus

27.08.2023 - 19:55 Uhr

Zu deiner Frage ob man das machen kann, kann man generell immer ja sagen.
Ist auch im einfachsten Fall alles machbar.

Python ist eine Skriptsprache, da gibt es keine .exe Datei.
Viel mehr führst du dort das .py Skript dann über die python Runtime aus.

Bei C# ist es aber nicht anders, auch dort ist die .exe nur eine .NET Anwendung, keine native .exe
Diese wird dann über .NET ausgeführt.

Es gibt für C# unmengen an Tutorials.
Wenn du mit der offizielen Doku nicht arbeiten kannst, dann müsstest du schauen ob du selbst passende Bücher findest.
Ob diese für dich taugen, musst du dann selbst prüfen.

Ich habe einige .NET und C# Bücher hier liegen.
Leider sind die meisten noch für .NET Framework.
Nur ein Buch für .NET 6 wäre in Deutsch, was mir bekannt ist.

Link:
https://www.amazon.de/NET-Grundlagen-Profiwissen-Rezepte/dp/3446469303

T-Virus

24.08.2023 - 22:44 Uhr

Bei DI geht es gewiss darum, dass sich die konsumierenden Klassen nicht um die Erzeugnung der Objekte kümmern müssen.
Dies ist ein wichtiger Aspekt um die Klasse selbst nicht mit konkreten Details zu belasten, was auch nicht die Zuständigkeit einer Klasse sein sollte und u.U. nicht mal machbar wäre.

Dein Code ist hier etwas zu einfach gehalten, zeigt aber den Kerngedanken von DI vereinfacht.
Hier ist es immer ratsam, gilt auch ohne DI, dass man gegen die Interfaces arbeiten sollte.
Dadurch vermeidet man eine strafe Kopplung zu konkreten Implementierungen.
Dies kann zwar u.U. gewünscht sein, sollte aber i.d.R. vermieden werden.
Gerade wenn man dann eine andere Implementierung braucht, müsste man den Code klonen und umschreiben, was unnötig und unsinnig ist.
Wenn du dich mit der Doku und .NET 7+ befasst, kommt man um das Thema nicht mal mehr drum herum.

Doku:
https://learn.microsoft.com/de-de/dotnet/core/extensions/dependency-injection

Ich bin gerade selbst dabei einige ältere aber wichtige ASP .NET Projekte die noch auf SOAP und WCF basierte Dienste anbieten nach .NET 7 und Docker zu migrieren.
Dort kommt man um DI nicht mal drum herum, was sogar sehr positiv ist.

Dies nimmt mir viel Arbeit ab, da ich die Erstellung von bestimmten Schlüsselobjekten an Microsofts Extension für DI verlagere.
Dadurch muss ich nur vorgeben wie die Objekte der jeweiligen Klassen erstellt werden (Singleton, Transient, Scoped).
Somit kann man auch sehr genau steuern ob es eben je nach Situation nur ein Objekt (Singleton), pro Request (Scoped) oder sogar pro benötigte Instanz (Transient) ein Objekt gibt.
Dadurch gibt man die Kontrolle zur Erzeugung der jeweiligen Instanzen auch aus der Hand bzw. verlagert diese aus den jeweiligen Klassen.

Das Thema kann bestimmt Abt und co. besser beschreiben 😃
Die sind da tiefer drin als ich.

T-Virus

24.08.2023 - 14:58 Uhr

@Abt
Meinst du nicht einen Full Table Scan?

Ansonsten brauchst du passende Indexe um die Daten optimal zu laden.
Gerade wenn die Datenmenge groß ist, spielt ein Index eine wichtige Rolle.
Natürlich sollte dieser zusammen mit der Abfrage passen.
Im Idealfall kannst du auch einen Index bauen, der dir alle Daten liefert.
Dadurch muss die Tabelle nicht angefasst werden, was aber nicht immer möglich ist.
Je komplexer die Abfragen werden und umso mehr Spalten/Tabellen bei der Abfrage dazu kommmen umso schwerer wird es hier nur mit Indexen zu arbeiten.

Alternativ wären auch materialisierte Views was, wenn sich die Daten selten ändern.
Dann musst du die View nur aktualisieren, wenn sich die Daten ändern.
Hier musst du aber prüfen was in Kombination mit deiner Anforderung am besten läuft.

T-Virus

24.08.2023 - 11:58 Uhr

Pauschal wirst du vermutlich keine passende bzw. die beste Antwort kriegen.
Du musst hier selbst prüfen welcher Ansatz das passende Ergebnis liefert.
Wenn du die Daten aus zwei Tabellen zusammenführen musst, wäre der UNION ALL Ansatz schon eine möglichkeit.

Ansonsten könntest du, wie in deinem zweiten Ansatz, die Daten per Join ermitteln und dann selbst Dedublizieren.
Dann brauchst du ggf. mehr Code um die Daten passend für dein Ergebnis aufzubereiten, dies kann u.U. aber auch besser sein.
Was der beste Ansatz ist musst du selbst prüfen/messen, da können wir dir nicht wirklich helfen.
Da spielen auch viele Faktoren eine Rolle wie z.B. Aufbau der Tabellen, Indexe usw.
Was für dich dann vertretbar ist und auch das korrekte Ergebnis liefert, musst du dann im Endeffekt selbst prüfen.

T-Virus

21.08.2023 - 10:10 Uhr

@M.L.
Wäre auch eine Möglichkeit.
Leider konnte ich bisher nicht rauslesen von was für einem Programm wir reden.
Wenn es eine UI Anwendung ist, wäre Docker raus.
Ist es aber nur ein Programm um Daten aufzubereiten o.ä. dann würde ich Docker auch einplanen.

T-Virus

21.08.2023 - 10:08 Uhr

So wie es aussieht, musst du wohl ein Test Projekt bereitstellen.
Hoffentlich ist das einfach machbar, dann kann es ggf. schnell gefixt werden 😃
Hatte zwar auch mal im Source geschaut, bin aber leider damit nicht sonderlich vertraut.
Wie portieren bei uns gerade auch einen Client von WPF zu Maui, da halte ich bei solchen Themen auch die Augen offen.

T-Virus

12.08.2023 - 09:48 Uhr

Eigentlich ist das Thema gut dokumentiert.
Schau mal ob du dort alles korrekt gemacht hast.

Doku:
https://learn.microsoft.com/de-de/aspnet/core/fundamentals/environments?view=aspnetcore-7.0

T-Virus

12.08.2023 - 07:42 Uhr

Gibt eine neue Version von moq, man beachte die Versionsnummer 😕
Langsam fühlt sich das ganze fast wie trollen an.

Release Notes:
https://github.com/moq/moq/releases/tag/v4.20.69

T-Virus

10.08.2023 - 18:32 Uhr

@Abt
Alles klar, bin auf Twitter/X nicht mehr aktiv bzw. logge mich nicht mehr an.
Da Elon die Ansicht stark beschnitten hat, konnte ich es nicht sehen.
Aber danke für den Hinweis!

T-Virus

10.08.2023 - 18:22 Uhr

Komisch, ich sehe folgende Meldung.

Scheinbar hat er schnell den Text geändert...

I'm sorry if I haven't been as active today as yesterday with the feedback, but it's the first time I had to unify two repos. Ended up cherry-picking every commit from the core impl. on top of the SposorLink public repo. There's surely a few stupid things here and there

T-Virus

10.08.2023 - 18:02 Uhr

Kleine Wende am Nachmittag, wenn auch keine große.
Kzu hat scheinbar SponsorLink als Open Source veröffentlicht.
Ist m.M.n. zu spät und dürfte dem Dammbruch nichts mehr entgegenwirken.

https://github.com/moq/moq/issues/1384
https://github.com/devlooped/SponsorLink

@Abt
Ja, da bin ich bei dir.
Ich finde es auch fraglich, dass man hier noch mit Sponsoring die Tat belohnt.
Es wurde oft genug darauf hingewiesen, dass hier ein Bruch des GDPR vorliegt und selbst ein Ersatz wie eine Guid hier keine saubere Lösung wäre.
Ich schau da noch eine Weile drauf aber das Schiff ist im großen und ganzen abgefahren.

T-Virus

10.08.2023 - 15:35 Uhr

Ja, das ist leider alles sehr unschön.
Bisher ist da auch nichts von Einsicht von Kzu zu sehen.

Leider zeigt es auch die Schwächen des Gesamtsystems.
Hier hat NuGet im Grunde die gleichen Probleme wie Node.js und andere Paketquellen ohne zusätzliche Maintainer die die Pakete vor der Freigabe nochmal gegenprüfen.
Wenn der Code und die Pakete durch die ganze Kette laufen können ohne diese genaustens zu prüfen, dann kann man darüber leider sehr viel Schaden anrichten.
Leider zeigt sich in diesem Fall, dass man dabei nicht mal Vertrauen in die eigentlichen Paketbetreuer bzw. den ursprünglichen Entwickler haben kann.
Was natürlich sehr schade ist, da man diesen Leuten auch sein Vertrauen bisher gerne geschenkt hat.
Ich habe mit Moq selbst bisher nur in einem Projekt gearbeitet, fand das Konzept und die Umsetzung damit aber sehr gelungen.

Ich sehe hier auch den Versuch seitens Kzu die Situation um OSS hier als Ausrede für diese Aktion vorzuschieben.
Bzw. eine schlechte Planung was den finanziellen Aspekt seiner Arbeit an geht.
Wenn man Software Entwicklung mit einer offenen Lizenz durchführt, dann kann man leider nicht erwarten das jeder Geld dafür springen lässt.
Hier muss man sich m.M.n. möglichst vorher überlegen ob man finanziell auf der Arbeit aufbauen will und dann durch entsprechende Konzepte und Ansätze einen finanzielle Unterbau aufstellen.
Hier reicht es eben nicht auf Sponsoren aller Art zu warten und hoffen.
Beispiele für solche Ansätze wären kommerzielle Erweiterungen für Moq o.ä.

Die meisten nehmen freie Software heute einfach als gegeben hin ohne an die Entwickler dahinter zu denken.
Hier bräuchte es ein Gesamtkonzept um solche Projekte allgemein besser zu fördern.
Ähnlich der Linux Foundation zur Sicherung der Entwicklung von Linux und Projekten rund um Linux.
Natürlich kann man dann auch nicht alle Entwickler damit abdecken aber es würde die Situation bei passenden Gemeinschaften etwas verbessern.

Ansonsten bleibt nur der Weg direkt zur Umstellung auf ein komerzielles Produkt bzw. Lizenz.
Dies wurde auch im github Issue bei Microsoft vorgeschlagen um eben damit Geld zu verdienen.
Wäre zwar für die Masse der Projekte schade, da Moq an sich eine gute Lib ist/war.
Aber es wäre alle mal besser gewesen als git Emails mit obfuscated Code abzuschnorcheln.

Ich bin etwas pessimistich was Mopq angeht.
Ich glaube nicht, dass nach der Aktion Moq noch eine große Zukunft hat.
Mich würde es auch nicht wundern, wenn das Projekt Heute moder Morgen dicht gemacht wird.
Nach der Aktion und die ganzen Projekten die jetzt abspringen, dürfte sich das in den nächsten Tagen und Wochen auch bei Kzu bemerkbar machen.

Nachtrag:
AWS scheint schon Konsequenzen zu ziehen und will aus den ehemaligen Sponsoren entfernt werden.
Soweit ich dies lesen konnte war AWS einer der wenigen die auch finanziell einmalig eingesprungen sind.
Sollte für Kzu eigentlich ein deutliches Signal sein.

Pull Request:
https://github.com/moq/moq/pull/1381

T-Virus

09.08.2023 - 19:03 Uhr

So wie sich seine Aussagen lesen, wird da auch keine Entschuldigung deswegen kommen.
Ist zwar Schade aber er selbst hat sich dazu entschieden.
Jetzt muss er mit den Konsequenzen leben.
Seine Reputation und die von Moq dürften jetzt gegen 0 gehen.
Alternativen stehen in den Startlöchern.

Link:
https://github.com/dotnet/runtime/issues/90222#issuecomment-1671736796

T-Virus

09.08.2023 - 15:03 Uhr

Bin nicht sicher ob es hier passt, falls nicht bitte verschieben.
Die viel verwendete Lib moq hat in der neusten Version ab 4.20 SponsorLink eingebaut.
Diese scheint mit Obfuskated Code via git die Benutzer Emails abzufragen, zu hashen und zu verschicken.
Ist alles sehr dubios und vom Entwickler von moq selbst initiiert.

Issue auf Github dazu:
https://github.com/moq/moq/issues/1372

Wer also moq verwendet, sollte das Thema im Auge behalten.
Ggf. sollte man auch auf Alternativen ausweichen.
Das Thema schlägt bereits hohe Wellen und m.M. nach auch zu recht.

Nick Chapsas dazu:
https://www.youtube.com/watch?v=A06nNjBKV7I

T-Virus

09.08.2023 - 09:19 Uhr

Die Null Prüfung kommt dadurch, dass der erste if Block erst den Typ auf Person prüft.
Durch das ! vor den Klammern, wird dann das Ergebnis umgekehrt.
Entsprechend würde er dort nur über das if springen, wenn das übergeben Objekt vom Typ Person ist.
Null und andere Typen entsprechen dann nicht dem Typ Person, entsprechend  würde er in diesen Fällen auch in das if springen!

Der zweite if Block ist gleichwertig zum ersten,dieser Syntax wird aber erst in einer neueren C# Version unterstützt.
Der erste if Block war quasi der "alte" Weg um die Negierung umzusetzen.
Durch die Einfügung von is not würde das dann sauberer gelöst.

Nachtrag:
Hier noch der Link zur Doku:
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/is

T-Virus

07.08.2023 - 13:03 Uhr

Ist alles dokumentiert, wenn man danach sucht und sich mal einliest.
Das ist übrigens nicht das erste mal, dass man dir den Hinweis auf die Doku gibt und dass du die Grundlagen lernen solltest.
Es macht ehrlich gesagt keinen Spaß und ist unnötig Mühe dir in jedem Thread von dir, das gleiche zu schreiben.
Bitte nimm es dir zu Herzen und lies die Doku oder ein Buch oder mach ein Tutorial.
Das Grundlagen Forum ist nicht dazu gedacht, dir alle Fragen zu den Grundlagen oder zur Anwendung sämtlicher .NET Klassen zu beantworten.
Dafür gibt es ausreichend Quellen (Doku, StackOverflow etc.)

Doku:
https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.clear?view=net-7.0

T-Virus

03.08.2023 - 16:02 Uhr

Deine Abfrage sollte mit == Prüfen.
Ein einzelnes = ist eine Zuweisung und hier vermutlich falsch.
Oder ist der Code nur beispielhaft runtergetippt?

Nachtrag:
Abt hat den Code schon mit dem Fehler getippt :p
Aber solltest du anpassen beim übernehmen.

T-Virus

31.07.2023 - 20:45 Uhr

Was genau ist hier das Problem?
Wollt ihr nur eine UI haben, dann wäre MAUI ein Weg weitere müsstet ihr ggf. evaluieren.

.NET Framework ist die alte Welt, hier sollte man schon seit längerem mit der Migration anfangen.
.NET Standard erleichtert euch dies auch ein gutes Stück weit, falls man den Code unter beiden Welten braucht.
Wenn ihr keinen harten Abhängigkeiten die nur für .NET Framework laufen, dann spricht auch nichts gegen einen kompletten Umstieg auf .NET 6/7/8+.

Wir sind gerade selbst dabei eine Web Anwendung auf .NET 7 zu migrieren und direkt per Docker auch noch als Container zu verteil.
Damit lösen wir uns auch von unserem einzigen Mono Web.
Ist in dem Fall aber auch einfach, da die Anwendung "nur" aus einem Service, einer Handvoll Tasks und einer Java Anwendung besteht.

Wie Abt aber schon schreibt, würde ich den Ansatz mit einem Web Server In App wieder verwerfen.
Spätestens wenn es in die App Stores z.B. bei Apple geht, wird die App nach einer genauen Prüfung vermutlich abgelehnt.
Dort sind die Vorgaben sehr strikt und solche Lösungen auch nicht gern gesehen.

Nachtrag:
Laut Stackoverflow kann ein Http Server max. 10 Min. laufen.

Link:
https://stackoverflow.com/questions/20698287/create-an-ios-app-that-runs-as-web-server-in-background

T-Virus

23.07.2023 - 19:54 Uhr

Wenn du Probleme mit den Api von Dritten hast, dann musst du dich an diese wenden.
Dort muss dir dann eine Doku bereitgestellt werden oder zu mindestens Support gegeben werden.

Falls das nicht passiert, such nach einer Alternative die auch dokumentiert ist und bei der du auch Support bekommst.
Verschwende keine Zeit mit undokumentierten Api von dritten, wenn es bessere Alternativen gibt!

T-Virus

23.07.2023 - 15:17 Uhr

Nebenbei sei auch erwähnt, dass dort Linq verwendet wird.

Doku:
https://learn.microsoft.com/de-de/dotnet/csharp/linq/

Anbei solltest du dir mal ein C# Buch o.ä. besorgen.
Die letzten Themen von dir sind alles Grundlagen.
Hier wäre es für dich hilfreicher erstmal C# zu lernen, dann erübrigen sich die Fragen zu den Grundlagen nach einer Weile.

T-Virus

22.07.2023 - 21:48 Uhr

Code scheint obfuscated zu sein.
Hier musst du nach der Doku vom Hersteller schauen, wie der Konstruktor aussieht.

T-Virus

22.07.2023 - 20:17 Uhr

Im einfachsten Fall wie bei einem Array über den Index des Elements.
Dadurch kannst du das alte Element überschreiben.

Doku:
https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.item?view=net-7.0

T-Virus

20.07.2023 - 07:36 Uhr

Eine Möglichkeit, wenn auch nicht schön, wäre z.B. bei DataRow die Methode SetColumnError dafür zu verwenden.
Dann kannst du z.B. mit HasErrors prüfen ob es in der Zeile Fehler gibt.

Alternativ müsstest du sonst ein eigenes Tracking umsetzen.
Im einfachsten Fall reicht dann z.B. ein Dictionary mit row/column Index als Key und bool als Value.
Solange die Daten im Grid nicht umsortiert oder gefiltert werden, sind die Keys dann auch fix.
Falls doch, wäre das Tracking schwieriger.

Doku:
https://learn.microsoft.com/de-de/dotnet/api/system.data.datarow.getcolumnsinerror?view=net-7.0

Nachtrag:
Wenn möglich wäre eine saubere Datenstruktur einem DataTable vorzuziehen.
DataTables sind ziemliche Speicherfresser und sehr unflexibel.
Wenn die CSV Dateien einen identischten Aufbau haben, leg die eine passende Klasse an und verwendet eine Liste als Datenquelle.
Dann brauchst du nur eine IsValid Property in deiner Klasse um dein Ziel zu erreichen.

T-Virus

20.07.2023 - 07:26 Uhr

Hallo,
bin zwar kein WPF Entwickler, aber ggf. kannst du z.B. den PK als CommandParameter mitgeben.
Dann sollte dieser im Button Click Event verfügbar sein.
Ob es einen besseren Ansatz gibt, weiß ich leider nicht.
Ggf. kannst du auch im Command auf das Model zugreifen aber das fehlt mir leider der Ansatz.

Doku:
https://learn.microsoft.com/en-us/dotnet/api/system.windows.controls.primitives.buttonbase.commandparameter?view=windowsdesktop-7.0#system-windows-controls-primitives-buttonbase-commandparameter

Nachtrag:
Damit das funktioniert müsstest du aber ein richtiges Model binden.
Aktuell baust du dir nur eine Gruppen Liste auf.
Hier müsstest du aber die einzelnen Treffer als eigene Modelle binden, damit du auf die entsprechenden Daten zugreifen kannst.

T-Virus

20.07.2023 - 07:19 Uhr

Hallo Abt,
hab noch ein paar Dinge gefunden.

1. Unter Nachrichtenzentrale bei Ausgang wird als Empfänger:in mein eigener Benutzer angezeigt. Hier sollten doch eigentlich die richtigen Empfänger stehen.

2. Beim Seitenwechsel unter Ausgang sowohl beim klick auf die Seitennummer als auch Letzte, springt er auf den Eingang. Hier zeigt die Verlinkung auf die falsche Seite. Anpassung der Url macht auch ein Redirect auf Eingang.

3. Meine gestrige Meldung eines Cross Posts kam scheinbar auch nicht an bzw. hat noch keiner darauf reagiert. 
Ich hatte hier nochmal eine extra PN an dich geschickt, kam die an?
Falls nicht, gehen ggf. aktuell keine PNs raus bzw. gehen nicht an die richtigen Leute wegen Punkt 1.

T-Virus

19.07.2023 - 09:10 Uhr

Eine kurze Suche bei Google mit "ssh.net send command" liefert gute Beispiele.

Link:
https://www.thecodebuzz.com/c-sharp-send-ssh-command-net-core-example/#aioseo-example-1-ssh-command-execute-apt-update-or-upgrade-command

Gibt auch weitere Beispiele, die sollten eigentlich alles bieten was du brauchst.

T-Virus

06.07.2023 - 12:23 Uhr

Bei Google hättest du direkt mit "Alpha Shape C#" eine Implementierung auf Github finden können.

Link:
https://github.com/less0/nAlpha

T-Virus

04.07.2023 - 23:36 Uhr

Dein Code sieht ziemlich C/C+ mäßig aus.
Get/Set Methoden werden in C# über Properties mit get/set umgesetzt.
Deine Methoden wäre als Properties vermutlich hilfreicher, solltest du entsprechend umbauen.
Den Ausdruck deiner if Abfrage kannst du direkt als return liefern, extra Abfragen mit return tue/false sind hier überflüssig bzw. redundant.

Ich bin nicht ganz sicher wie dynamisch deine Auswertungen werden können.
Wenn es hier auch Positionen geben kann, dann entfällt foreach, da du u.U. die genaue Position ermitteln müsstest.
Eine Liste wäre nur dann sinnvoll, wenn die Größe der Liste klein bleibt.
Ansonsten verbrauchst du u.U. viel Zeit nur mit dem durchlaufen der Liste und Auswerten der Fälle.
Dies könntest du zwar mit Linq bis zu einem gewissen Punkt erledigen.

T-Virus

04.07.2023 - 22:36 Uhr

Kommt darauf an was für Daten du wie konfigurieren und analysieren willst.
Ab im einfachsten Fall kann man das so machen.
Wenn du noch ein paar mehr Infos gibst, was du grob vor hast, kann man ggf. einen besseren Ansatz liefern.

T-Virus

02.07.2023 - 19:12 Uhr

Setzt dir für Abeuter lieber eine VM auf, dann kannst du das zurücksetzen etc. per Mausklick machen.

Spart dir Zeit und Nerven.

T-Virus

28.06.2023 - 14:15 Uhr

Hier hast du gleich mehrere Probleme.
Zum einen arbeitet man in der UI nicht mit dem DbContext bzw. vermischt man nicht die Datenhaltung mit der UI.

Ebenfalls machst du auch ein ToList, was die Daten aus der DB einlädt und materialisiert.
Dadurch ist die Liste und die Objekte darin eigenständige Objekte.
Bei Änderungen an deinem Datenstand wird sich das Grid nicht selbst updaten.
Dies müsstest du in deinem Programm selbst lösen.
Wenn z.B. über das Grid Einträge angelegt werden, musst du diese auch der DataSource hinzufügen und in der DB anlegen.
Ansonsten ist dein aktuelle Vorgehen unbekannt bzw. nicht beschrieben.

T-Virus

27.06.2023 - 18:49 Uhr

Kommt halt darauf an was du brauchst/machst.
Wenn du die Sachen per CDN einbindest, müsstest du sicherstellen, dass es wegen Datenschutz nicht zu Problemen kommt.
Ebenfalls musst du dann sicherstellen, dass deine extern eingebundenen Resourcen auch alle kompatibel zu einander sind.
Bei CDNs kannst du dann auch Probleme kriegen falls diese ausfallen oder wenn sich die Pfade durch Umstellungen ändern.
In beiden Fällen musst du dann im Notfall hinterher arbeiten, was bei Selbsthosten kein Problem darstellt.

Auch kann es bei alten Versionen passieren, dass diese irgendwann nicht mehr per CDN ausgeliefert werden.
Spätestens dann wärst du in der Situation unter Zeitdruck die spezifische Version selbst zu hosten oder Updates einspielen zu müssen.
Ich bevorzuge auch aus diesen Gründen bei solchen kritischen Komponenten immer lokale Einbindungen gerade wenn diese essentiel für meine Anwendung sind.

T-Virus

27.06.2023 - 18:09 Uhr

Sind das wirklich externe Resourcen?
Wenn du diese zur Entwicklung deiner Anwendung nutzt, dann würde ich diese auch direkt ausliefern.
Also Bootstrap, jquery und co. sollten direkt lokal ausgeliefert werden.

Dadurch hat sich dann auch das Thema mi dem Datenschutz weitestgehend erledigt, da die Einbindung über dritte komplett entfällt.
Ob ein CDN überhaupt nötig/sinnvoll ist, kann ich nicht beurteilen.
Aus meiner Sicht würde ich ein CDN erst nutzen, wenn absehbar ist, dass Bandbreite ein Problem werden könnte.
Ansonsten reichen für kleine Projekte auch ein einfacher Webserver mit Support für .NET
Kann man ggf. auch mit einem Rasperry Pie von zu Hause hosten 😃

Nachtrag:
Nach einer kurzen Prüfung würde ich sagen, dass du alle deine Resourcen selbst hosten kannst.
Diese sind eigentlich auch alle auf Github mit entsprechenden Releases vertreten.

T-Virus

26.06.2023 - 11:19 Uhr

Hab mir mal den Code vom Repository angeschaut.
Ohne Aufwand wirst du das nicht auf Windows XP zum laufen kriegen.
.NET 6 hat auch keinen Support für Windows XP, entsprechend funktioniert der Weg nicht.
Entweder musst du auf eine alte .NET Framework Version umbauen, was aber auch Aufwand bedeutet oder einfach z.B. Linux auf deinen Laptop packen und damit arbeiten.
Dann sollte es eigentlich auch ohne Probleme laufen.

Link:
https://github.com/danielnilsson9/bbs-fw
https://github.com/danielnilsson9/bbs-fw/tree/master/src/tool

T-Virus

22.06.2023 - 11:28 Uhr

Im Bestfall sollte man Null ja vermeiden. :p

Ich bevorzuge meistens Handling B, da ich dann auch Nesting vermeiden kann.

Nicht selten finde ich auch noch alten Code von mir, bei dem teilweise 4-5 Ebenen in if Blöcken verschachtelt sind, was den Code sehr unleserlich macht.

T-Virus

21.06.2023 - 23:20 Uhr

Hast du dir mal den Artikel von Microsoft dazu angeschaut?

https://learn.microsoft.com/de-de/dotnet/maui/user-interface/layouts/absolutelayout

Da wird recht gut erklärt wie es funktioniert.

Ansonsten solltest du dir die Warnung dort zu Herzen nehmen.

Absolute Positionierung von Child Elementen ist keine gute Idee, da es bei unterschiedlichen Auflösungen dann "kaputt" aussieht.

https://learn.microsoft.com/de-de/dotnet/maui/user-interface/layouts/absolutelayout#absolute-positioning-and-sizing

T-Virus

16.06.2023 - 11:38 Uhr

Klingt dann eher nach einem Interface mit Ableitungen für den Editor.
Die Methoden zum schreiben können dann bei nur lesen dann leer bleiben oder eine entsprechende Meldung erzeugen.
Wäre auch von der zukünftigen Wartung durch bedingte Kompilierung schwieriger und würde den Code auf lange Sicht enorm unleserlich machen.
Dann lieber sauber den Code auftrennen in die entsprechenden Varianten und über Config oä. steuern welche Instanz verwendet wird.
Kannst du dann mit weiteren Mustern (Factory) o.ä. lösen.

T-Virus

16.06.2023 - 11:23 Uhr

Wie genau sehen die Varianten im Code den aus?
Klingt halt erstmal nach einem Interface mit unterschiedlichen Ableiten z.B. wie beim Strategie Muster.
Oder verstehe ich was falsch?

T-Virus

16.06.2023 - 11:21 Uhr

Hab gerade einen Beitrag erstellt und auf die Dokumentation für C# Bedingte Kompilierung verwiesen.
Im Markdown sieht der Link korrekt aus.
Wenn man diesen im Beitrag dann öffnet, stimmt dieser nicht mehr bzw. wird der part hinter # in der Url verändert.
Dadurch kann die Sprungmarke nicht mehr aufgerufen werden, die eben mitgeben wird.

Beitrag:
https://mycsharp.de/forum/posts/3839534

Link:
https://learn.microsoft.com/de-de/dotnet/csharp/language-reference/preprocessor-directives#conditional-compilation
https://learn.microsoft.com/de-de/dotnet/csharp/language-reference/preprocessor-directives#conditional-compilation

Nachtrag:

Beim schreiben habe ich auch das Problem, dass ich beim drücken von Enter immer eine zusätzlich Leerzeile habe.

Diese kann ich nur in der Markdown Ansicht wieder entfernen.

Den Nachtrag kann man auch zum oberen Teil der Antwort daran erkennen 😦

T-Virus

16.06.2023 - 11:13 Uhr

Kann man machen.

Auch C# hat einen Präprozessor für bedingte Kompilierung.

https://learn.microsoft.com/de-de/dotnet/csharp/language-reference/preprocessor-directives#conditional-compilation

Ob das aber hier sinnvoll ist, hängt vom Ziel ab.

T-Virus

15.06.2023 - 16:39 Uhr

Die Doku dazu sollte doch eigentlich alles haben, was du brauchst.

Doku:

https://learn.microsoft.com/de-de/dotnet/csharp/language-reference/keywords/event

Ansonsten gibt es noch bei Google mit C# und Events einige treffer.

https://csharp-hilfe.de/csharp-events/

T-Virus

12.06.2023 - 18:21 Uhr

Du solltest die Klasse als Singleton umsetzen, da du auch nur einen TCP Listener hast und diesen als static markierst.

Dadurch geht dein Server schon den Schritt Richtung Singleton aber hier nur halbgar, da du einen public Konstruktor hast.

Dadurch wäre es aktuell mögliche mehrere Instanzen zu erstellen und den Server mehrfach zu starten.

Würde zwar wegen dem listener knallen, wäre aber möglich.

T-Virus

12.06.2023 - 18:13 Uhr

Wie sieht den dein Code aus?

In dem Beispiel wird auch ein eigener Comparer implementiert und an das SortedSet mitgegeben, damit die Endungen auch korrekt geprüft werden.

Dieser hat mit einem kurzen Test auch ohne Probleme funktioniert.

Ein Rufruf mit einfachen Dateinamen funktioniert ohne Probleme.

// ByFileExtension ist der Comparere aus der Doku
SortedSet<string> fileNames = new SortedSet<string>(new ByFileExtension());
fileNames.Add("Test.htm");
fileNames.Add("Test.pdf");
fileNames.Add("Test.php");

SortedSet<string> pdfFiles = fileNames.GetViewBetween("pdf", "pdg");

foreach (string pdfFile in pdfFiles)
    Console.WriteLine(pdfFile);

T-Virus

12.06.2023 - 15:31 Uhr

Ich sehe in deinem Code unmengen an Problemen.

Die Klasse solltest du als Singleton umsetzen.

buffer ist bei dir ein Klassen Feld, entsprechend rufen alle Clients gleichzeitig den Buffer ab oder verwenden diesen.

Was dann drin steht ist purer Zufall.

Hier solltest du dringend den Code überarbeiten.

Dein Code ist auch mit try/catch vollgestopft, die viel mehr machen als sie sollten.

Ebenfalls ist das try/catch in GetShellForStationID unnötig, wenn dein Code sauber ist.

Die Begin/End Methoden des TCPListener solltest du durch die Async Methoden ersetzen.

Das ist noch ein uraltes Konzept für asynchrone Programmierung aus .NET 2.0 Zeiten, ist also sehr sehr altes Zeug.

T-Virus

03.06.2023 - 18:41 Uhr

Kann es sein,das du einfach bei der newVersion noch ein .0 anhängen musst?

Normalerweise sind die vierstellig.

Doku:

https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/redirect-assembly-versions

Nachtrag:

Ich setzte bei mir auch gerne als oldVersion die Range von 0.0.0.0 bis zur spezifischen Version.

Sonst hat man u.U. das Problem, wenn andere Abhängigkeiten wieder mit anderen Versionen reinlaufen, dass es dann wieder Fehler gibt.

Somit werden quasi alle auf die neue Version umgebogen.

T-Virus

17.05.2023 - 16:16 Uhr

Klingt erstmal nach einem abgelaufenen Zertifikat.

Eigentlich kannst du dir das Zertifikat im Browser anschauen.

Dort sollte es dann drin stehen.

T-Virus