Die folgende Tabelle kennst du schon? https://learn.microsoft.com/en-us/partner-center/membership/partner-success-core-benefits#benefits
Es sieht so aus, als ob du direkt mit dem resx Dateien in einem Programm arbeiten willst. Dann musst du vermutlich folgende Dokumentation befolgen:
https://learn.microsoft.com/en-us/dotnet/core/extensions/work-with-resx-files-programmatically
Davon würde ich dir aber abraten. Für deinen "einfachen" Fall kannst du es so machen:
Wenn du mit Visual Studio oder Jetbrains Rider arbeitest, musst du im Grunde nur die Resx-Dateien erstellen und füllen. Andere IDEs können das bestimmt auch, damit hab ich aber keine Erfahrung. Man kann das ganze natürlich auch alles manuell (ohne IDE) machen, in dem man die jeweiligen Tools selbst ausführt.
Die IDE erstellt dir dann automatisch C#-Dateien und bindet diese beim kompilieren mit ein. In deinem Code kannst du dann sehr einfach mit <RootNamespaceDeinesProjekts>.<ResourceDateiName>.<StringNameInDerResx>
auf deine Texte zugreifen. Die Sprache kannst du ändern, in dem du CultureInfo.CurrentUICulture
änderst.
Beispiel:
using System.Globalization;
while (true)
{
Console.WriteLine("Type culture code:");
string input = Console.ReadLine();
CultureInfo.CurrentUICulture = CultureInfo.GetCultureInfo(input);
Console.WriteLine("> " + LocalizationDemo.MyStrings.HelloWorld);
}
Type culture code:
de-de
> Hallo Welt
Type culture code:
en-us
> Hello World
Type culture code:
es-es
> Hola Mundo
Die resx-Dateien bei mir heißen:
den generierten Code kannst du auch öffnen und dir anschauen, wie das funktioniert.
PS: Ich habe gerade diesen (https://github.com/ycanardeau/ResXGenerator) Source Generator ausprobiert und der macht potentiell das Gleiche wie die Tools, die von den IDEs aufgerufen werden.
Zumindest erwähnen sollte man das Crossposting. Wenn jemand mit ähnlichem Problem dein Forenbeitrag findet, dann kann derjenige zumindest die anderen Crossposts nach weiteren Lösungen/Ideen durchsuchen.
Noch schöner wäre es natürlich, wenn die Lösung am Ende dann auch hier und in allen anderen Crossposts mitgeteilt wird.
Oder in den Markdown Modus wechseln und dort weiterschreiben.
Zitat von Th69
Deine letzte Schleife überprüft aber nur, ob die Zahl 3 dreimal vorkommt, denn
wuerfelCheck.Contains(3)
ermittelt, ob die Zahl 3 im Array enthalten ist und die AbfragewuerfelCheck[i] == 3 && check == true
kann also dann nur erfüllt werden, wenni
den Wert3
hat.
Ich glaube du verwechselst wuerfelCheck
und wuerfel
. Hat mich aber auch etwas Zeit gekostet das zu verstehen.
In wuerfelCheck
wird die Anzahl wie oft die Zahl (der Index) gewürfelt wurde gespeichert. Mit dem Contains
wird also geprüft, ob irgendein/e Zahl/Index genau 3 mal in wuerfel
vorkommt. Anschließend geht die Schleife wuerfelCheck
durch und sucht den Eintrag, der 3 mal vorgekommen ist.
Wenn du das Ergebnis nicht auf dem Heap speichern musst, kannst du das Array auch mit stackalloc anlegen:
ReadOnlySpan<char> toSplit = "Hallo Welt";
Span<Range> ranges = stackalloc Range[2];
var count = toSplit.Split(ranges, ' ');
Ich würde dir raten auf https://learn.microsoft.com/de-de/dotnet/api/system.net.sockets.udpclient.receiveasync?view=net-8.0 umzustellen, damit der Thread nicht mehr blockiert wird.
Du erzeugst eine neue Form (eine neue Instanz) mit new Form1();
Wenn du die Methode Ausgabe
in der bereits existierende Form aufrufen möchtest, muss du die Referenz auf diese in der Methode oder im Konstruktor mitgeben.
In der Methode:
public void TEST(Form1 form1)
{
form1.Ausgabe();
}
Aufruf:
ClassTagAuslieferung NeuerTag = new ClassTagAuslieferung();
NeuerTag.TEST(this);
Ja mit Notepad++ (notepad plus plus) kann man auch in allen Dateien in einem Verzeichnis suchen und ersetzen. Es können auch Filter für die Dateien gesetzt werden und viel mehr.
Links (solange es keine Werbung, Spam oder Malware ist) sollten erlaubt sein.
Ich hab mir die Mod mal auf Nexusmods heruntergeladen und angesehen, dass man dafür überhaupt keine C#-Kenntnisse braucht.
Im Grunde sind die ganzen Dialoge in XML-Dateien vorhanden. In den XML Dateien stehen dann auch die Schriftgrößen. Die Dateien selbst sind wahrscheinlich im Installationsverzeichnis des Spiels vorhanden und müssten eventuell nur angepasst werden. Wenn du das entsprechende technische Verständnis hast, kannst du die Dateien mal versuchen zu finden und dann die Schriftgrößen in den Dateien ändern. In der Mod ist die Ordnerstruktur so aufgebaut:
In den Ordnern sind .stringtable Dateien die du mit einem normalen Editor (wie z. B. notepad++) öffnen kannst:
<?xml version="1.0" encoding="utf-8"?>
<StringTableFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>conversations\02_abc\02_foo</Name>
<NextEntryID>1</NextEntryID>
<EntryCount>27</EntryCount>
<Entries>
<Entry>
<ID>1</ID>
<DefaultText><size=145%>Lorem ipsum.</DefaultText>
<FemaleText />
</Entry>
<Entry>
<ID>2</ID>
<DefaultText><size=145%>[Lorem ipsum]</DefaultText>
<FemaleText />
</Entry>
<Entry>
...
Die Zahl nach size=
bestimmt die Textgröße. Die 145 kommen von der Mod, sollten also bereits groß sein.
Achtung: Achte darauf, dass du dein Spiel nicht kaputt machst und deine Spielstände verlierst. Mach lieber eine Kopie des Spieleordners, bevor du etwas veränderst.
PS: Leider habe ich das Spiel nicht, sonst könnte ich dir noch weiterhelfen.
Wenn das Spiel mit Unity programmiert wurde, stehen die Chancen gut, dass du jemanden findest, der dir eine Erweiterung/Mod mit C# programmiert. Allerdings wird das wahrscheinlich niemand umsonst machen.
Beziehst du das Spiel über Steam? Im Spiel ist der Steam Workshop integriert und es gibt eine Mod, die die Schriftgröße in den Dialogen vergrößert: https://steamcommunity.com/sharedfiles/filedetails/?id=2989374022
Einfach mit Steam auf Subscribe/Abonnieren drücken und die Mod sollte beim nächsten Start verfügbar sein. (Eventuell musst du diese im Spiel noch irgendwo aktivieren, das ist von Spiel zu Spiel unterschiedlich)
Zitat von Abt
Einfach mein Link lesen; das passiert nicht mal.
Meinst du den folgenden Link? https://tera-digital.com/blogs/barcodes/what-is-gs-replacement
Auf der Seite ist nicht wirklich beschrieben was gemacht wird. Ich vermute das GS wird bei der Ausgabe durch ein anderes Zeichen ersetzt. Und so habe ich das Problem, dass ich nicht weiß, ob das ersetzende Zeichen nicht irgendwann in den Daten des Barcodes auftaucht.
Beispiel aus einem konkreten Fall:
Die Lieferanten unserer Kunden schicken Etiketten mit Barcodes mit dem folgenden Inhalt: <(]<GS>ABCDEF1234<GS>Artikelbeschreibung X<GS>LOT_NO1234<GS>20231012<EOT>
In unserem Fall hat es dann auf Serverseite geknallt weil das Xml mit dem GS nicht geladen werden konnte. Im Client haben wir das Xml einfach per String-Verkettung gebaut.
Wenn nun das GS durch ein anderes Zeichen ersetzt wird, dann muss es ein Zeichen sein, dass nicht in den Daten (Artikelnummer, Artikelbeschreibung, etc.) vorkommen kann.
Wir haben darauf keinen Einfluss und Lieferanten aus dem asiatischen Raum halten sich, in unserem Fall, auch nicht zu 100 % an Standards oder Vorgaben von uns.
Zitat von Abt
Jeder Standard XML bzw. Json Serializer konvertiert non-printable chars automatisch in die UTF-16 Repräsentation.
Kontrollzeichen mit dem .NET Xml Serializer und auch das direkte Laden via xmlDocument.LoadXml
gehen auch in .NET 8 noch nicht. (siehe https://dotnetfiddle.net/WwArTE)
Wenn das Xml aber mit der System.Xml API aufgebaut wird, dann wird das Zeichen automatisch mit HTML Entities (
) kodiert. Das wurde aber damals von uns nicht verwendet, das Xml wurde noch mit Stringverkettungen aufgebaut. Zur Verteidigung: Ob das System.Xml damals mit .NET Compact Framework 2.0 bereits gemacht hat, kann ich nicht sagen.
Wenn der Browser aber die Kontrollzeichen direkt bei der Eingabe bzw. Verarbeitung rauswirft, dann hilft die Kodierung auch nichts. Und wenn man eine öffentliche API baut, sollte sich natürlich an Standards gehalten werden. In unserem Fall wurde das Xml einfach nur über eine einfache TCP Verbindung an die Serveranwendung geschickt (ist aber auch eine Legacy Anwendung von ca. 2008)
Wenn du kontrollieren kannst, dass dein Ersatzzeichen nicht irgendwann von einem Lieferanten im Barcode auftaucht, dann kannst du das machen.
In unserem Fall hatten wir das gleiche Problem bei den mobilen Geräten (Motorola mit Windows CE und Compact Framework) unserer Kunden. Vielleicht hätten wir dort im Gerät irgendwo etwas ähnliches einstellen können. Aber diese Zeichen wurden als Trennzeichen in den Barcodes verwendet um einzelnen Daten von einander zu trennen. Wenn ein Lieferant jetzt plötzlich einen Barcode mit ]
im Dateninhalt schickt, bekommt die Anwendung die Daten nicht mehr von den Trennzeichen getrennt. Und dann ständig alle Geräte auf neue Ersatzeichen um konfigurieren? Nein danke, dann lieber kodieren und wieder dekodieren.
Die Zeichen sind vermutlich einfach in JSON oder XML (je nachdem was du sendest) nicht erlaubt und deshalb quittiert der Server das mit einem Internal Server Error. Probier mal die Eingabe zu kodieren (z.B. base64), dann zu senden und dann im Server wieder zu dekodieren.
In deinem Screenshot siehst du "_capture" war "null"
. Deine _capture
Variable war zum Zeitpunkt der Ausführung "null", d.h. du hast diese nicht initialisiert. Deine Methode Prototyp_load
wird nie ausgeführt. Du hast vermutlich vergessen deine Prototyp_load
Methode als Load Eventhandler deiner Form zu setzen.
Du solltest dir das folgende mal durchlesen. Damit findest du solche Probleme auch ganz schnell selbst.
[Artikel] Debugger: Wie verwende ich den von Visual Studio?
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:
Ist der recipient
im 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 recipient
auszulesen?
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="7.0.0" />
Server Version: 10.5.19-MariaDB-0+deb11u2
Ich hab keinen ValueConverter
und auch keinen Aufruf von .HasConversion
im Modell. Zeig mal dein aktuelles Modell.
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();
Hilft das hier vielleicht: https://support.abp.io/QA/Questions/5019/72-and-71-Maui-Android-crashes-in-Release-mode-but-works-in-Debug
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.
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
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 😄
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)
Du setzt das SelectedViewModel in deiner LoginVM und nicht in der BasicWindowVM.
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.
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.
siehe Use functionality from NuGet packages
Dazu muss dein Source Generator aber als NuGet Package verpackt sein.
Mir sind noch zwei Probleme aufgefallen:
Und einen Wunsch gibt es auch noch:
Hier eine mögliche Lösung auf StackOverflow: c# - Don't save embed image that contain into attachements (like signature image) - Stack Overflow
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.
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.
Fragezeichen hinter das Sternchen:
<tr>[\s\S]*?<\/tr>
Hilft dir das hier: Permissions - .NET MAUI
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);
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.
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?
Eine Möglichkeit:
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.
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.
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.
@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)
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.
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)
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
...
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;
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.
Es wäre gut, wenn du etwas (gekürzten) Code und Beispiele für das JSON zeigen könntest.