Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Palladin007
Thema: Wie suche & finde ich Farb Pixel auf dem Screen?
Am im Forum: Grafik und Sound

Man kann die WinAPI (und andere) Funktionen mit C# aufrufen.
Die Technologie dafür heißt "p/invoke"
Hilfreich ist da die Website pinvoke.net.

Thema: dynamische Code evaluierung
Am im Forum: Rund um die Programmierung

Was Du mit den Predicates machen willst, geht langfristig in die Hose.
Es gibt/gab zwar ein Framework, das eine LambdaExpression als String de/serialisiert, das könntest Du dann speichern, aber wie gesagt: Das geht in die Hose ^^

Besser wäre aber, Du denkst um und beschränkst dich auf das, was mit der Datenbank geht.
Z.B. eine Art Mapping, welcher Config-Eintrag mit welchem Key/Value geprüft werden soll oder ob der Wert ein Regex-Pattern ist und so weiter.

Zitat von Abt
Prinzipiell schon, verwendet zB EF unter der Haube.

Hast Du einen Namen oder Link oder eine Quelle?
Hier steht kein Provider dafür.
Oder gibt's das nicht als eigenes Packages, sondern nur intern in EFCore?
So ein DB-Provider ist eigentlich das Einzige, was ich da noch vermissen würde.

Thema: dynamische Code evaluierung
Am im Forum: Rund um die Programmierung

Microsoft.Extensions.Configuration

Das macht das ganze mit JSON, XML, INI, what ever.
Gibt's glaub auch für die DB, dann aber nicht von Mircosoft, ein eigener DB-Provider wäre aber nicht so riesig schwer.
Damit arbeitest Du dann mit IConfiguration und das arbeitet mit Strings.

Zusätzlich gibt's noch Microsoft.Extensions.Configuration.Binder und Microsoft.Extensions.Options (mit Microsoft.Extensions.Options.ConfigurationExtensions)
Ersteres bietet die Möglichkeit, die Konfiguration auf Objekte zu mappen und Letzteres liefert eine Options-Pattern-Implementierung mit automatische Anbindung an die Konfiguration..

Die Konfiguration solltest Du in Form einer simplen Key/Value-Tabelle speicherst, zusätzlich so Infos wie eine Beschreibung oder der Typ. Bedenke aber, dass der Key auch zum Configuration-Prinzip aus den Frameworks passen muss, schwer ist das aber nicht.
Das kannst Du dann leicht anzeigen und bearbeiten, das Configuration-Framework liefert dann den Zugriff innerhalb des Programms und kann ggf. auf Objekte gemappt werden.


PS:
JimStark war wohl schneller

Thema: Sammelthema Wünsche und Bugreports myCSharp
Am im Forum: Wünsche und Kritik

Alle Links in einem neuen Tab halte ich für eine ganz schlechte Lösung.
Aber nur externe Links in einem neuen Tab sind denke ich ein guter Zwischenlösung.

Thema: Sammelthema Wünsche und Bugreports myCSharp
Am im Forum: Wünsche und Kritik

Zitat
Gewonnen hat die Argumentation, dass wir nicht immer im neuen Fenster öffnen, sondern das dem Benutzer überlassen (zB durch mittlere Maustaste).

Ich hätte es auch lieber anders :-)

Ich schließe mich deinen Kollegen an: Lieber dem Nutzer überlassen.
Warum ... keine Ahnung, vielleicht Gewohnheit.
Allerdings arbeiten sehr viele andere Websites auch so, ich halte es für klüger, ungefähr bei dem zu bleiben, was verbreitet ist.

Ich persönlich nutze aber so gut wie immer die Mitteltaste und öffne einfach alles in einem neuen Tab.
Es würde mich also nicht wirklich stören, wenn Du das änderst - ich habe so oder so nach ca. 10 Minuten rund 500 Tabs

Thema: App Status auf anderem PC
Am im Forum: Netzwerktechnologien

Oder eine gemeinsame Server-Anwendung, bei der jeder Prozess regelmäßig seinen Status hinterlegt.
So könnte jeder Prozess dort den Status anderer PCs abfragen und wenn später auch Datenaustausch nötig wird, wäre das einfacher.

Thema: Zugriff auf Klasse mittels String-Variable
Am im Forum: Grundlagen von C#

Bei einem Catch, das einfach nur irgendeinen Default zurückgibt, bekomme ich Bauchschmerzen.

Gerade beim Thema Reflection sind die Namen fest definiert, da ist nichts dynamisch. (Naja, außer man lädt/generiert zur Laufzeit, aber das ist hier nicht der Fall)
Ist ein Name falsch, dann ist er nun mal falsch und definitiv ein Fehler zur Entwicklungszeit. So ein Fehler sollte nicht geschluckt werden!
Ich persönlich arbeite daher möglichst mit nameof (Docs), dann passt der Compiler für mich auf.

Viel eher könnte man eine "TryGetValue"-Methode daraus machen und dann entsprechend reagieren, wenn der Wert nicht gefunden wird. Dann aber bitte prüfen, ob's die Property gibt und nicht mit Exceptions für den Kontrollfluss arbeiten.
Oder man lässt die Exception fliegen (kapselt sie ggf. in einer Exception mit sprechendem Namen und mehr Infos) und erfährt dann auch auf Anhieb, was das Problem war.
Konkrete Exceptions an der konkreten Position sind sehr viel leichter zu behandeln, als ein Fehler wie "irgendwo ist irgendwann ein null entstanden".

Außerdem habe ich die Erfahrung gemacht, dass solche allgemeinen ExtensionMethods früher oder später zu Chaos führen.
Bedenke, dass sie für alles gelten (object) und Du sie daher auch überall aufrufen kannst, was einerseits nervig werden und andererseits zu ungünstigen Abhängigkeiten führen kann.
Abgesehen davon ist das Ding auch nichts anderes als eine ganz normale statische Methode mit ein bisschen Compiler-Zucker und den gleichen Nachteilen, die jede statische Methode hat. Bei diesem Beispiel ist das kein Problem, sobald aber etwas spezifischere Logik dazu kommt, wird es zu einem Problem, das Du nicht mehr so einfach weg bekommst.

Das heißt, wenn es auf eine solche Reflection-Lösung hinauslaufen sollte:
Einfach eine normale private Methode in die Klasse, in der sie gebraucht wird.
Und ein sinnvolles Fehlerhandling indem z.B. geprüft wird, ob es die Property auch wirklich gibt und ein Setter da ist.

Thema: Probleme mit Registry-Abfrage von zwei Registry-Pfaden
Am im Forum: Rund um die Programmierung


var value = GetDisplayVersionOrNull("...")
    ?? GetDisplayVersionOrNull("...");

if (value == null)
{
    // ...
}
else
{
    // ...
}

Muss keine eigene Methode sein, macht das aber cleaner.

Ach und guck dir das an:
Registry.GetValue(String, String, Object) Methode (Microsoft.Win32)
Erspart dir vermutlich die eigene GetDisplayVersion-Methode.

Und Thema NullReference:

Packs in eine Variable und prüf drauf, in der eigenen Methode kein Problem.
Oder so:


var value = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("...")?.GetValue("DisplayVersion");
Beachte das Fragezeichen vor "GetValue".

Thema: Ein Daumen hoch oder "Rockt" Button
Am im Forum: Wünsche und Kritik

Zitat von Abt
Kommt noch zusammen mit dem Feature, dass man überhaupt sieht, was man gelesen hat ;-)

Hast Du eine Lösung für das Performance-Problem gefunden?

Thema: Sammelthema Wünsche und Bugreports myCSharp
Am im Forum: Wünsche und Kritik

Super Idee, gefällt mir gut

Aber einen kleinen Kritikpunkt habe ich:

Aus diesem Stück Text:


=====
[type]FileInfo[/type]
=====
[msdocs]FileInfo[/msdocs]
=====
[nuget]MediatR[/nuget]
=====

wird dieses Ergebnis:

=====
FileInfo (Api-Docs)
=====
FileInfo (Docs)
=====
MediatR
=====


Sieht aus, als würde da ein paar Zeilenumbrüche verschluckt werden?

Thema: Flurl.Http, C#, PHP, MySQL und das Thema Sicherheit
Am im Forum: Web-Technologien

Das sind halt alles Dinge, die mit den Frameworks ASP.NET und Refit quasi keine Arbeit mehr sind
Für ASP.NET Core gibt's in VisualStudio entsprechende Templates, da kannst Du eines erstellen, was dann auch direkt einen Test-Endpunkt hat.

Und für Refit gibt's ne gute kleine Doku - leider nur mit async.
Du kannst natürlich auch ohne Refit arbeiten, musst den ganzen Client-Kram dann aber selber machen.

Thema: Wie lerne ich C#?
Am im Forum: Smalltalk

C#-Version != .NET-Version
Du kannst auch auf steinalten .NET-Versionen mit neuer C#-Version arbeiten, es funktionieren bloß nicht alle Funktionen - zumindest nicht ohne etwas Vorbereitung.


Und die Top-Level-Anweisungen finde ich ziemlich unnötig.
Auch viele andere Features in den letzten Versionen halte ich für fragwürdig (z.B. ref return). Sie mögen ihre Daseinsberechtigung haben, gerade für einen Einsteiger oder jemanden, der nicht immer jedes Detail einer Funktion nachliest, können sie sogar gefährlich sein.

Thema: Wie lerne ich C#?
Am im Forum: Smalltalk

Naja, die Probleme, wie man C# lernt, gibt's ja auch nicht erst sei kurzem und die Lösungen sind immer die gleichen
Ja, Bücher und Artikel sind nicht immer top-aktuell, aber wie gesagt: Die Grundlagen sind identisch.
Wenn Du top aktuell magst, dann lies die MSDN-Doku, die haben auch eine Sparte für Einsteiger.

Ach ja, hab ich letztens hier kennengelernt:
https://www.youtube.com/watch?v=pyN7JTQM7sU
Ist die einzige Tutorial-Reihe, die ich nicht pauschal ablehnen würde - zumindest sieht sie auf den ersten Blick sehr gut aus und Microsoft guckt drauf.
Wie umfangreich und detailliert das ist, kann ich aber nicht sagen und mMn. sind Bücher immer noch die besste Option.
Oder sein eigener Kanal - bleibt immer noch ein Microsoft-Mitarbeiter und ich glaube nicht, dass sie ihn Mist veröffentlichen lassen.

Zitat
Ich weiß nicht mal direkt für was ich diese Sachen brauche oder was ich damit machen.
Da ist C#.NET eine gute Lösung, damit lässt sich sehr viel machen und Du legst dich nicht auf irgendeine Nische fest.

Thema: Wie lerne ich C#?
Am im Forum: Smalltalk

Zitat
Habt ihr Empfehlungen wie ich vorangehen sollte..?
Beispiele ausprobieren, umschreiben, kaputt machen, wieder reparieren, etc. - solange, bis begreifst, warum welcher Fehler auftritt und die Korrektur funktioniert.
Du sollst das alles nicht auswendig lernen, sondern verstehen, dann kommt der Rest von alleine.
Wenn irgendetwas im Kurs nicht (genug) erklärt wird, gibt's noch das Internet, andere Bücher oder dieses Forum.

Entscheidend ist, dass Du das Gelernte mit anderen Dingen kombinieren und anwenden kannst, denn Du wirst nie genau diese Situation nochmal haben.
Zitat
Ich hab hier schon auf der nach Kursen gesucht oder Büchern bis jetzt vergeblich
Dann haben wir den nächsten Punkt, den Du lernen musst: Recherchieren, denn Bücher werden ohne Ende empfohlen - auch hier.
Ich glaube aber nicht, dass es da eine Checkliste gibt, das lernst Du mit der Zeit. Also nicht einfach aufgeben, in den allermeisten Fällen wurde deine Frage schon beantwortet und deine Suche war einfach nicht gut genug.
In manchen Foren (auch hier) gibt's auch immer wieder Beispiele, wie man ewas effizient suchen kann, weil irgendwer etwas gefragt hat, was man mit einer klugen Suche nach wenigen Sekunden hätte lösen können

By the way: Such auf Englisch, ist x-fach besser.

PS:
[FAQ] Wie finde ich den Einstieg in C#?
Das dort verlinkte Buch von Andreas Kühnel ist ziemlich gut (hab ich auch hinter mir), hat aber ein paar Jahre auf dem Buckel. Den Nachfolger ist von 2019, kostet aber Geld.
Wenn Du das Geld nicht hast, kannst Du auch beim Buch von 2012 bleiben. Die absoluten Grundlagen sind aber identisch, es sind nur neue Features dazu gekommen und die kann man sich leicht in der Doku anlesen. Bei den Frameworks (auch .NET) hat sich aber einiges getan, doch die Beispiele funktionieren trotzdem.

Thema: Programm soll nichts tun, bis Rechner online ist
Am im Forum: Code-Reviews

Dann zähle, wie oft es nicht funktioniert hat und ab einer bestimmten Anzahl zeigst Du einen Fehler an.

Dass sich alles aufhängt, kannst Du nur (sinnvolle) mit dem Task-based asynchronous pattern lösen.
Das solltest Du aber nicht "irgendwie" nutzen, die Lernhürde ist hoch und um es richtig nutzen zu können, musst Du es auch verstanden haben.

Ich persönlich würde es aber ganz anders machen.
Ich würde eher Verbindungsfehler entsprechend behandeln und anzeigen.
Der Nutzer kann weiterhin das Programm nutzen, bekommt bloß immer angezeigt, dass keine Verbindung notwendig ist.
Oder Du machst es wie z.B. Outlook und zeigst irgendwo im Programm an, dass es keine Verbindung gibt.

Thema: Programm beenden über das Nertzwerk
Am im Forum: Rund um die Programmierung

Ich schließe mich dem an: Blöde Idee
Ihr baut euch nur Probleme, wie das dann aussieht, habe ich das letzte Jahr live und in Farbe bewundern dürfen/müssen.

Früher hatte ich eine Anwendung mit ClickOnce verteilt, klappt gut, hat bei uns aber aus irgendwelchen Gründen immer öfter für Probleme gesorgt, warum, das habe ich nie herausgefunden.
Stattdessen habe ich dann eine eigene Alternative basierend auf AutoUpdater.NET gebaut, da hatte ich dann auch mehr Möglichkeiten, was gerade für intern genutzte Anwendungen praktisch ist.

In beiden Fällen liegen die Versionen dann auf dem Server und die Clients laden sich dann immer den neusten Stand runter, geprüft wurde z.B. beim ersten Start des Tages
Bei ClickOnce konnte man dann auswählen, ob aktualisiert werden soll, was manche Mitarbeiter kategorisch abgelehnt haben.
Der Selbst-Bau war da flexibler, da konnte ich dann einstellen, ob's ein Pflicht-Update ist, oder nicht.

Thema: Event aus asyncroner Methode
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Führe die Events doch direkt in der Methode aus, oder gibt es einen konkreten Grund, warum Du das nicht machst?
Die Methode ist nicht nur wegen des awaits automatisch in einem neuen Thread, für die Methode gilt intern das gleiche, wie für das Event.
Den neuen Thread hast Du erst dann, wenn Du auch tatsächlich einen neuen Task auf machst, der dann einen neuen Thread bekommt.

Mach dir Mal in VisualStudio eine Watch auf auf die aktuelle ThreadID oder schreib dir ThreadID ins Debug-Output und verfolge sie.

Zitat
Task mit Progress verwenden
Das Progress-System ist nur ein Konzept, Status-Änderungen abstrahiert an die UI weiterzugeben.
Du musst kein Progress nutzen, aber Du kannst. Nutzen würde ich es nur dann, wenn ich es auch brauche.
Zitat
dass async void wie fire-and-forget zu betrachten ist
Der Aufruf von einer Methode mit async void ist wie fire-and-forget, die Methode selber nicht.


// EventHandler sind seltene Ausnahmen, wo async void in Ordnung ist:
async void OnMyEvent(object sender, EventArgs e)
{
    // UI-Thread
    await DoWorkAsync();
    // DoWorkAsync ist zuende
    // UI-Thread
}

async Task DoWorkAsync()
{
    // UI-Thread
    await Task.Delay(100);
    // Task.Delay ist zuende
    // UI-Thread
}

// Fast immer schlecht:
async void DoAsyncVoidWork()
{
    // UI-Thread
    await DoWorkAsync();
    // DoWorkAsync ist zuende
    // UI-Thread
}

void DoOtherWork()
{
    // UI-Thread
    DoAsyncVoidWork(); // Fire & Forget
    // await DoAsyncVoidWork(); // Compile-fehler
    // DoWorkAsync ist NICHT zuende
    // UI-Thread
}

Du solltest dich ausführlich mit Tasks beschäftigen.
Für kleine Projekte ok, solange Fehler nicht so schlimm sein, aber im produktiven Umfeld können die schnell zu schlimmen Problemen werden.
Die Einstiegshürde ist leider ziemlich groß, dafür machen sie einige Probleme bedeutend leichter, wenn man weiß, was man tut.

Thema: Event aus asyncroner Methode
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Das await ist im Hintergrund etwas anders, als Du denkst.
In deinem Fall wird das await vermutlich alles darauf Folgende in den UI-Thread zur Bearbeitung geben.
Das await kehrt dabei nicht fire-and-forget zurück! Dass kein Task zurückgegeben wird, heißt nur, dass der Methodenaufrufer nicht auf den Task warten kann, aber das ist bei Events legitim.

Das heißt, Du kannst nach dem Await normal ein Event aufrufen.

Thema: RestAPI oder vergleichbares
Am im Forum: Datentechnologien

Für den Client kenne ich noch Refit - macht das alles sehr viel einfacher


Und als kleiner Hinweise:
ASP.NET != ASP.NET Core
Letzteres ist der Nachfolger
Viele alte Blogs oder Foren-Fragen gehen nur auf ASP.NET ein, daher ist es nützlich, den Unterschied zu kennen.
Der Link von T-Virus ist aber korrekt, obwohl da nur ASP.NET steht.

Thema: Refresh eines einfachen window
Am im Forum: Grundlagen von C#

Zitat
[...] da diese Experten nicht schreiben, was in die .xaml.cs und was in die .cs Datei kommt.
Niemand sagt dir, was Du in welche Datei schreiben sollst - wenn Du das willst, musst Du dir einen Mentor suchen, dem dein Lernerfolg egal ist und dir alles diktiert.
Es geht um Prinzipien und Konzept, die musst Du verstehen und wenn Du dich konsequent weigerst, dich darauf einzulassen, wirst Du nicht weiter kommen.
Wenn Du das verstehst, wird auch klar, was bei deinem Projekt wo hin muss.

Vergiss, was Du über WPF zu wissen glaubst und bau dir kleine Beispiel-Projekte, mit denen Du dann die Konzepte ausprobieren kannst.
Oder ignoriere weiterhin alle Ratschläge, hänge weiter in der Luft und verzweifle - das ist dann nämlich hoffnungslos.

Denn wie Abt schon sagt:
Alles, was Du suchst und vermisst, wird durch die Dinge gelöst, die Du dir nicht anschauen willst.
Und ja, ich schreibe bewusst "nicht anschauen willst", weil das mein Eindruck ist.
Diese Konzepte sind zugegeben nicht immer ganz einfach, aber wenn Du nach einem Tag und "Blick ich nicht durch" schon aufgibst, ist das mein Eindruck.

PS @Abt:
Sicher, dass die Links von Xamarin kommen sollten?

Thema: Wie mit JavaScript Daten ohne DB-Server speichern?
Am im Forum: Smalltalk

Zitat
auch nicht auf dem pc?
Zitat
[...] It is a self-contained, serverless, [...]
Nein, auch nicht auf dem PC.
Zitat
aber warum steht da c# dahinter
Weil es erklärt, wie man es mit C# nutzt.

Thema: Refresh eines einfachen window
Am im Forum: Grundlagen von C#

Zitat
doch mit einem Create WPF anzufangen und die dll dann als Referenz hinzuzufügen.
Zitat
Es werden dann bestimmt eine Menge Folgeprobleme entstehen. Das wichtigste dabei, dass mein auftraggebendes System diese Projekt dann auch noch als Script erkennt.
Zitat
daher meine endlosen Eigenversuche
Es hilft manchmal, wenn Du nicht weiter kommst, nochmal von Vorne anzufangen.

Daher nochmal:
Lass WPF weg, fang mit einer ganz billigen DLL an, in der eine Klasse ist:

public static class MyTestClass
{
    public static string GetText()
    {
        return "Hello World!";
    }
}

Das rufst Du dann in deinem Skript auf - das ist das Minimum, das funktionieren muss.
Wenn das geht, lässt sich (da bin ich zuversichtlich) auch WPF zum Laufen bringen, oder WinForms, wenn dir das besser liegt.

PS:
Wobei dein Skript WPF verwendet, das ist also vermutlich eine Voraussetzung, damit das Skript funktioniert und WinForms wäre wieder eine zusätzliche Hürde, denn beides zusammen ...
Ich musste so ein WinForms-WPF-Misch-Projekt mal aufräumen - ich würde es nicht meinem schlimmsten Feind wünschen.

Thema: Refresh eines einfachen window
Am im Forum: Grundlagen von C#

Zitat
Ich bin eben kein Informatiker
Was macht dich denn zu einem Informatiker?
Bin ich ein Informatiker, weil ich das gelernt habe, oder war ich das schon in der Schule, weil ich C# gelernt habe?
Bist Du ein Informatiker, sobald Du mit C# arbeitest, oder brauchst Du dafür erst eine Ausbildung?

Meine Meinung:
Das ist völlig egal.
Jeder fängt bei 0 an, Informatiker hin oder her.
Die Ausrede zieht daher nicht

Wenn Du Probleme hast, in die .NET-Welt einzusteigen, dann ist das oft ein Zeichen dafür, dass Du zu weit hinten anfängst und WPF ist ein hervorragendes Beispiel für "zu weit hinten".
Also tu dir einen Gefallen, arbeite dich in die Grundlagen ein und arbeite dich dann Stück für Stück zu WPF vor.
Oder Du beharrst auf deinem Vorgehen, versuchst weterhin irgendwelche Frickellösungen zu bauen und wirst weiterhin so Probleme haben, wie jetzt.
Zitat
Deshalb bin ich doch kein "schlechter" Mensch!
Nein, hat auch niemand behauptet, Abt hat bloß ein Talent dafür, besonders hart ehrlich zu sein (sorry :D)
Aber auch wenn Du kein "schlechter" Mensch bist - diese Sichtweise ist (und das geht nicht weniger hart) einfach dumm.
Du vergeudest sehr viel Zeit für haubtsächlich selbst gebaute Probleme und bemerkst dabei nicht, dass der auf den ersten Blick längere Weg (vorne anfangen und lernen) sehr viel kürzer, leichter und vor allem nervenschonender ist. Also der blumenbewachsene Weg, der dann plötzlich über ein Hochgebirge führt, während der Andere mit einem steilen Hügel beginnt und danach durch schöne Graslandschaften führt.

Also nimm dir das zu Herzen, vergiss, was Du bisher gelernt hast und fange vorne an.
Das dauert etwas, aber mit der Zeit verstehst Du, warum wir so sehr darauf beharren und vielleicht auch, wie Du viele Dinge besser lösen kannst.
Und wenn Du einen konkreten Punkt z.B. in deinem Buch nicht verstehst, kannst Du dich nochmal hier melden und ich denke, dann ist Abt auch etwas gnädiger
Zitat
und wie bekomme ich es "an meine cs-Datei angekoppelt"!

Das hat nichts mit WPF zu tun, sondern hauptsächlich mit diesen Skript-Kram. Eine Referenz in VisualStudio hinzuzufügen ist super einfach, in deinem Fall musst Du vermutlich das Programm dazu bringen, das zu machen. Geht das nicht, gibt's noch andere Wege, aber die sind komplexer und meist ziemlich unschön, das sollte also nur die allerletzte Lösung sein.
Was Du also brauchst, ist, wie Du eine selbst entwickelte DLL als Referenz hinzufügen kannst. Wie das geht, kann dir aber niemand sagen, das muss das Programm tun. Fang mit etwas ganz kleinem an (Methode gibt "Hello World" zurück - reicht) und versuche das irgendwie ins Script zu bekommen.
Danach sehen wir weiter.

Thema: Refresh eines einfachen window
Am im Forum: Grundlagen von C#

Hast Du eine Projekt-Datei, oder nur die cs-Datei?
Oder kannst Du eigene DLLs als Referenzen hinzufügen?

Dann kannst Du nämlich ein ganz normales C#-WPF-Projekt (DLL, nicht zum Starten) erstellen, dort das implementieren, was Du brauchst, das Ergebnis als Referenz hinzufügen und das komische Skript fügt das nur noch zum Window hinzu.

Der letzte Teil (das zum Window hinzufügen) ist ziemlich einfach:


window.Content = new MyScriptControl();
window.DataContext = new MyScriptViewModel(context);
window.ShowDialog(); // Wenn das nicht automatisch passiert

Hängt natürlich noch davon ab, was ich von dem Skript-Kram jetzt nicht weiß, aber ziemlich sicher lässt sich der Großteil sehr leicht davon trennen und als klassisches WPF-Projekt aufbauen.
Wenn Du die Referenzen nicht in das WPF-Projekt rüber bekommst, musst Du eine Abstraktion schaffen, könnte dann so aussehen:


// Im WPF-Projekt
public interface IScriptContext
{
    // ...
}

// Im Script-Projekt
internal class ScriptContextFacade : IScriptContext
{
    private readonly ScriptContext _realContext;

    public ScriptContextFacade(ScriptContext realContext)
    {
        _realContext = realContext;
    }

    // ...
}

public class Script
{
    public void Execute(ScriptContext context, Window window)
    {
        window.Content = new MyScriptControl();
        window.DataContext = new MyScriptViewModel(ScriptContextFacade(context));
        window.ShowDialog(); // Wenn das nicht automatisch passiert
    }
}

Wie gut das funktioniert, hängt natürlich auch davon ab, was das da ist, aber ich wette mit dir: Das geht

Und als Tipp für die Zukunft:
Erwähne direkt am Anfang den Elefanten namens "Skript-Gefrickel", was Du da nutzen musst und reduziere dein Beispiel auf das eigentliche Problem.
So wirkt das eben sehr danach, dass Du noch einer der vielen "Ich will in zwei Tagen WPF-Apps programmieren, bitte erklärt mir alles"-Leute, auch wenn Du das gar nicht bist.


Zitat
In der Vergangenheit habe ich sogar ein Projekt gemacht, wo ich eine Grafik als Window über einen HTML String mit Java Einfügung programmiert habe, nur um das für mich obscure WPF zu umgehen

Und das klingt sehr danach, dass Du scheinbar genau die Probleme hattest, die Abt prophezeit hat:
Du hast falsch angefangen, irgendwie versucht, damit klarzukommen und bist (nachvollziehbar) daran verzweifelt.
Dabei kann WPF sehr viel Spaß machen, aber man braucht den Einstieg und mit der Einstellung wird dir das nie gelingen - und dein Projekt auch nicht.

Thema: Wie mit JavaScript Daten ohne DB-Server speichern?
Am im Forum: Smalltalk

Ja.

Wie genau, das hängt von ungefähr allem ab, von dem Du uns aber nichts mitteilst.

Thema: Parameter Count aus einer DLL Methode
Am im Forum: Rund um die Programmierung

Das geht nicht dynamisch, irgendwo brauchst Du einen gemeinsamen Stand, anhand dessen Du weißt, wie Du XY aufrufen kannst.
Hast Du diesen gemeinsamen Stand nicht, musst Du wohl oder übel alles einzeln machen.
Oder Du rätst, was es für Parameter gibt, wirst dann aber ziemlich sicher irgendwann den Fall haben, dass Du die richtigen Parameter nicht errätst.

Deshalb sollte man das auch umdrehen:
Nicht dein Programm muss die externe DLL und die Parameter der Methoden kennen, sondern die externe DLL kennt dein Programm.
Dein Programm liefert dafür dann eine Schnittstelle, die die externe DLL nutzt - das ist dein gemeinsamer Stand.

Du könntest also ein Interface definieren, wo die Methode, die Du brauchst, definiert ist und als Parameter wird alles übergeben, was Du bieten kannst/darfst.
Die externe DLL muss dann dieses Interface implementieren und kann dann die Daten so weiter reichen, wie es für die jeweilige Version richtig ist.
Diese Implementierung findest Du dann via Reflection oder einer Art Registrierungs-Interface, was aber auch wieder implementiert und irgendwie gefunden werden muss.
Dein Programm bekommt dann die Implementierung und hat ein eindeutiges Interface zum Aufrufen.

Bei externen DLLs geht das natürlich nicht so einfach, da brauchst Du denn einen Vermittler dazwischen - je Version.
Dieser Vermittler implementiert dein Interface und ruft darin die externe Version auf, der muss dann immer angepasst werden, dein Haupt-Programm bleibt dabei aber unberührt.
Der Vermittler kann in C# oder C++/CLI geschrieben werden, je nachdem, was einfacher ist, hauptsache es kommt eine managed DLL bei raus.
Du kannst natürlich auch unmanaged arbeiten, kannst dann aber nicht mit .NET-Interfaces arbeiten und musst irgendwie anders die native Methode definieren, die dein Programm aufruft.

Der Nachteil ist, dass Du je Version eine zusätzliche DLL brauchst, aber je nach Umfang der externen Methoden ist das nur sehr wenig Arbeit.
Außerdem sehe ich das nicht als Nachteil, sondern als Vorteil, denn Du hast einen einzigen Punkt, den Du anpassen musst und gefährdest dein restliches Programm nicht.
Die könnte man z.B. sogar zur Laufzeit austauschen oder als einzige DLL raus geben, ohne das ganze Programm aktualisieren zu müssen.

Thema: Kein externes Zugriff auf die MySQL-Datenbank bei IONOS
Am im Forum: Datentechnologien

Warum mischst Du jetzt C# mit PHP?
Ich persönlich halte PHP in der heutigen Zeit für ein grausiges Chaos, das ich möglichst vermeiden würde
Und selbst wenn ich es gut fände - ich würde keine zwei Welten mischen, wenn es sich doch eigentlich sehr gut nur mit C# machen lässt.

Dir wurden schon alle notwendigen Technologien genannt: ASP.NET Core und Refit, beides kannst Du mit C# nutzen.

Die Doku von Microsoft zu ASP.NET Core (von Abt verlinkt) ist ziemlich gut, leider bringt dieses Framework auch einige Konzepte mit, die für einen Einsteiger etwas schwierig zu verstehen sind. Dennoch solltest Du das weiter verfolgen, nicht nur, weil dir das einiges an Arbeit ersparen kann, sondern weil Du so gleichzeitig einige Dinge aus dem riesigen Themengebiet Softwarearchitektur und Designpatterns lernst - also das, was Du in deinem Buch vermisst hast und das darin garantiert jeden Rahmen gesprengt hätte. Wie gut das für einen blutigen Einsteiger geeignet ist, kann ich nicht sagen, aber Du hast auf jeden Fall eine Grundlage, an der Du dich entlang hangeln und ggf. fehlendes Wissen anderswo auffrischen kannst.

Und Refit macht den zusätzlichen Aufwand der Gegenseite (deine WinForms-Anwendung) sehr einfach, jedenfalls kenne ich keinen einfacheren Weg, sowas zu machen.

Also nochmal grob umrissen:
Du brauchst eigentlich zwei Programme: Die Server- und die Client-Anwendung, daher auch "Server-Client-Architektur".

Die Server-Anwendung läuft auf irgendeinem gemieteten Server und ist im Internet oder Intranet erreichbar.
Sie darf als einziges Programm mit der Datenbank arbeiten und kann (je nachdem, wie Du das aufbaust) auch einiges an Logik übernehmen, dann muss das nicht in der Client-Anwendung entwickelt werden.
Die Server-Anwendung wird mit ASP.NET Core entwickelt.

Die Client-Anwendung läuft auf den PCs, wo Du dein Programm laufen lassen willst und brauchen eine Verbindung zu dem Server.
Dieses Programm darf nicht mit der Datenbank sprechen, sondern "fragt" die Server-Anwendung, ob sie bestimmte Daten herausgeben oder ändern kann, dafür schickt sie normale HTTP-Anfragen zum Server, Inhalte erden über die URL oder als Inhalt von Form von JSON übermittelt. Die Server-Anwendung prüft diese Anfrage (kann ggf. ablehnen, wenn was falsch ist) und erfüllt ggf. die Aufgabe. Die Client-Anwendung zeigt dann nur noch die Ergebnisse an.
Die Client-Anwendung ist deine WinForms-Anwendung und kommuniziert mit der Server-Anwendung, Refit vereinfacht das enorm.
Auf die Registry zugreifen geht auch, ist ja ein normales WinForms-Programm auf Windows-PCs, die Informationen musst Du dann mit zum Server schicken.

Ach ja:
Nutze bitte eine Quellcodeverwaltung - falls Du es noch nicht tust.
Das hast Du dir mit wenig Arbeit eingerichtet, kannst dir leicht verschiedene Stände pflegen und verlierst nichts bei deinen Experimenten oder z.B. einem Hardware-Problem.


Und lass PHP aus dem Spiel.
Wenn Du das so machst, wie gezeigt, musst Du praktisch alles selber machen.
Oder Du verwendest fertige Frameworks, die es sicher auch für PHP gibt, dann stehst Du aber wieder vor dem Problem, dich in großes Framework einarbeiten zu müssen - noch zusätzlich zur anderen Programmiersprache mit einem ganz anderen Ökosystem drum herum.
Dann kannst Du auch gleich ASP.NET Core lernen.

Thema: Mehrere AppDomains, Umbenennung der .exe, Assembly wird nicht gefunden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat
So ein CI könnte man natürlich auch schnell mit einem Batch-Script implementieren: Pullen/Auschecken, Compilieren, VSTest-Ausführen, Dateien-Kopieren und Setups builden...
Passend dazu eine kleine top aktuelle Geschichte von mir:
Ich hab die letzte halbe Woche mit einem System, das sich "Build-Server" schimpft, gekämpft.
Dieses System hat (so mein Eindruck) genau so begonnen, wie Du beschreibst: Ein simples Script, das Kompiliert und das Ergebnis bereitstellt (keine UnitTests und kein Setup)
Zu diesen simplen Anforderungen sind immer mehr dazu gekommen und das Script wurde immer größer, bis daraus eine interne Website (PHP und CMD) wurde, die man mit Script-Fragmenten in XML "konfiguriert" wird, damit es ein CMD-Script zusammen baut und ausführt. Und dieses Build-System ist voll mit Fallstricken und Bugs, um die bisher irgendwie drum herum gebastelt wurde, weil sich keiner an den Code heran traut.

Ein Kollege hat vorher schon wochenlang damit gekämpft und viel von den Erkentnissen an mich weiter gegeben, nur deshalb habe ich "nur" eine halbe Woche für meine Anpassung gebraucht.

Um nochmal auf deine Aussage zurückzukommen:
Zitat
So ein CI könnte man natürlich auch schnell mit einem Batch-Script implementieren: Pullen/Auschecken, Compilieren, VSTest-Ausführen, Dateien-Kopieren und Setups builden...
Ja, kann man so machen, wird dann halt scheiße
Oder Du nimmst dir ein/zwei Tage Zeit, arbeitest dich in die Thematik ein und testest, was geht.

Thema: .NET (Core) von .NET Framework 4.8 aus nutzen möglich?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat
Durch unser Geschäftsmodell müssen wir jedoch ständig in der Lage sein, sehr schnell auf gewisse Kundenanforderungen zu reagieren - das zeichnet uns aus und davon leben wir.
Das habe ich fast so oft gehört, wie die Anzahl Firmen, bei denen ich bisher gearbeitet habe
Sie alle hatten Chaos und auf die Frage, warum sie dieses Chaos nicht aufräumen konnten, kam dann die immer-gleiche Aussage (oder Ausrede), dass man schnell und handlungsfähig bleiben muss.

Das geht aber nur so lange gut, bis eben dieses Chaos besagte Handlungsfähigkeit so sehr einschränkt, dass es geschäftsschädigend wird und wenn entscheidende Personen erst dann mit sich reden lassen, ist es oft schon zu spät.
Wenn Du die Zeit und Muße hast, kannst Du ja mal eine Zeit- und Kostenplanung erstellen. Oft ist einem Chef ohne entsprechendes Wissen gar nicht bewusst, welche Probleme manche Entscheidungen entstehen lassen, so eine Zeit- und Kostenplanung kann da aber helfen.

Und bezüglich Zwischen-Schicht:

Ich habe mal in einer Firma gearbeitet, die einen ähnlichen Plan verfolgt hat.
Ein sehr altes und sehr großes C++-Projekt, nicht mehr wirklich wartbar, aber man muss ja schnell und handlungsfähig bleiben.
Der Plan war also, das Neuerungen in C# umgesetzt werden, das C++-Projekt nutzt dann die Exe, gibt Daten rein, bekommt Daten raus, etc.
Der Plan war (vermutlich) mehr und mehr den C++-Code zu verschlanken und Stück für Stück auf eine modulare C#-Basis hinzuarbeiten und auch von neuen Technologien profitieren zu können.
Das Ergebnis nach über 10 Jahren war, dass das C++-Programm viel von seinem Chaos (z.B. irre Datei-Formate) auf die C#-Projekte übertragen hat und die meisten der C#-Projekte jetzt an einem ähnlichen Punkt stehen, wie das C++-Programm.

Ich will damit auf den ewigen Grundsatz hinaus: Provisorien halten am längsten.
(Und ja, ich weiß, dass das wirklich nicht vergleichbar ist)

Wie auch immer...
Wenn für euch nur diese Herangehensweise in Frage kommt, dann macht das so.
Achte aber darauf, dass sich das nicht im Sand verläuft und Ihr nicht in der gleichen Falle landet, wie mein Beispiel.

Thema: YouTube Kanal Deutsch (C#, ASP.NET, uvm.)
Am im Forum: Smalltalk

Zitat
This is the official YouTube channel for the .NET team at Microsoft.