NTH-Library

    • Release
    • Open Source

    Es gibt 43 Antworten in diesem Thema. Der letzte Beitrag () ist von nikeee13.

      Ja, ich mach das nur weil es mir lustig ist ;)

      C#-Quellcode

      1. public static T Low<T>(ValueType Value) where T : struct
      2. {
      3. int TargetSize = Marshal.SizeOf(typeof(T));
      4. int SourceSize = Marshal.SizeOf(Value);
      5. if (TargetSize * 2 != SourceSize)
      6. {
      7. throw new Exception("Meldung und so");
      8. }
      9. var Buffer = Marshal.AllocHGlobal(SourceSize);
      10. Marshal.StructureToPtr(Value, Buffer, true);
      11. // Für High-Funktion Buffer + TargetSize
      12. var Result = Marshal.PtrToStructure(Buffer, typeof(T));
      13. Marshal.FreeHGlobal(Buffer);
      14. return (T)Result;
      15. }

      C#-Quellcode

      1. ushort a = 0x3210;
      2. Console.WriteLine(High<byte>(a).ToString("X") + " : " + Low<byte>(a).ToString("X"));
      3. ulong b = 0xfedcba9876543210;
      4. Console.WriteLine(High<uint>(b).ToString("X") + " : " + Low<uint>(b).ToString("X"));
      5. System.Drawing.Point c = new System.Drawing.Point(123, 456);
      6. Console.WriteLine(High<int>(c).ToString() + " : " + Low<int>(c).ToString());
      7. System.Drawing.Rectangle d = new System.Drawing.Rectangle(12, 34, 56, 78);
      8. Console.WriteLine(High<System.Drawing.Size>(d).ToString() + " : " + Low<System.Drawing.Point>(d).ToString());

      Ergibt:
      32 : 10
      FEDCBA98 : 76543210
      456 : 123
      {Width=56, Height=78} : {X=12,Y=34}


      Hmm. Ich frage mich, was wohl passiert, wenn man anfängt, mit Void zu experimentieren. Und mit Structures, die Referenzen beinhalten. Oder T nicht auf Structure beschränkt.

      Edit: Ok, auch interessant.
      Einfach mal die Adresse rausfischen:
      Spoiler anzeigen

      C#-Quellcode

      1. public static T ToSomething<T>(ValueType Value) where T : struct
      2. {
      3. int TargetSize = Marshal.SizeOf(typeof(T));
      4. int SourceSize = Marshal.SizeOf(Value);
      5. var Buffer = Marshal.AllocHGlobal(Math.Max(SourceSize, TargetSize));
      6. Marshal.StructureToPtr(Value, Buffer, true);
      7. var Result = Marshal.PtrToStructure(Buffer, typeof(T));
      8. Marshal.FreeHGlobal(Buffer);
      9. return (T)Result;
      10. }
      11. public class Bar
      12. {
      13. }
      14. public struct Foo
      15. {
      16. public Bar b;
      17. }

      C#-Quellcode

      1. Foo f = new Foo() { b = new Bar() };
      2. Console.WriteLine(ToSomething<ulong>(f).ToString());


      8149339529489022988

      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

      Das geht zwar, aber es hat absolut keinen semantischen Sinn, HIWORD (oder Ähnliches) von einem Struct zu machen. Da kann man auch genausogut eine Instanzmethode definieren, die das (managed und sicher) macht.

      Für die Primitiven Datentypen ist das ebenfalls Murks. Ich allokiere doch nicht im unverwalteten Speicher, nur um die ersten 8 Bits eines Shorts zu bekommen.

      Edit:
      Ich habe gerade einen kleinen MAPI-Wrapper gebastelt, um den Default-Mailclient dazu aufzufordern, eine bestimmte Email zu schicken. Benutzt wird der so:

      C#-Quellcode

      1. var mail = new MapiMail();
      2. mail.Subject = "Maximum subject";
      3. mail.MessageBody = "Dem body";
      4. mail.Attachments.Add(@"X:\some\file.txt", "display name.txt");
      5. mail.CcRecipients.Add("mail@example.com");
      6. mail.SendPopup(); //mail.SendDirect() sendet ohne popup, bei dem man noch was ändern kann


      Bei Thunderbird öffnet sich dann das entsprechende Fenster. Gleiches würde mit jedem anderen Mailclient passieren, der die MAPI kann. Siehe Anhang.

      Jetzt die Frage: Soll das in die NTH-Lib? Ich würde ja fast schon sagen, dass das zu speziell ist.
      Bilder
      • mapi.png

        22,61 kB, 530×264, 127 mal angesehen
      Von meinem iPhone gesendet

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nikeee13“ ()

      Ganz cool fände ich eine Prüfung von Werten von Properties.
      Beispiel.

      C#-Quellcode

      1. [StringProperty(MinimumLength = 0, MaximumLength = 10)]
      2. public string Name
      3. {
      4. get;
      5. set;
      6. }

      Hier wird bei der Property geprüft ob die Länge des String größer als 0 und kleiner als 10 ist.
      Ist dies nicht der Fall wird eine Argumentexception geworfen.
      Ich habe schon mal angefangen das umzusetzten. (Reflection)
      Es scheitert aber daran, dass ich es nicht schaffe der Property von "außen" einen Changed-Listener hinzuzufügen.
      Das könnte man zwar über das Implementieren von INotifyPropertyChanged lösen, aber das finde ich sehr unschön.
      Falls jemand eine Idee hat kann er es mir ja mitteilen :)

      Generell ließe sich dieses Prinzip groß aufziehen. (z.B Möglichkeit Dateipfade zu prüfen etc.)
      Weil es nicht möglich ist, von außen universell auf eine Änderung zu reagieren.
      Außerdem widerspricht das auch den Attribut-Pattern, Attribute sind nämlich eigentlich nur statische Informationen, die an anderer Stelle ausgewertet werden können. Ein Attribut sollte niemals selbst irgend ein Verhalten hinzufügen/ändern.
      @LaMiy genau dafür sidn CodeContracts da. Die funktionieren im Gegensatz zu einer eigenen Implementierung mit Attributen auch zur Compiletime, denn mit denen kann der Compiler (oder irgendwas davor) den Code auch schon analysieren und gibt entsprechende Warnings/Errors aus.

      In diese Library passt das auch nicht ganz, glaub ich.

      Habe mal Version 1.1.1 veröffentlicht. Neu ist u. A. die SemanticVersion-Klasse. Samples dazu folgen.
      Von meinem iPhone gesendet

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nikeee13“ ()

      Ich brauche noch ein paar Meinungen zu der zukünftigen BitUtil-Klasse. Momentan ist es noch in einem separaten Branch. Ich bin mir bei der Benennung nicht sicher.
      PR: github.com/nikeee/nth/pull/3

      Noch sind die Methoden nach den ursprünglichen Makros benannt. (Lo statt Low, Hi statt High). Soll das so bleiben oder soll ich das nach Low/High umbenennen?

      Da ich nach SemVer-Standard versionisiere, kann in Version 1.x.y nicht einfach ich hinterher die Methoden umbenennen. Das ginge erst in 2.x.y.

      Noch was anderes:
      Die SemanticVersion-Klasse soll bald serialisierbar sein:
      github.com/nikeee/nth/compare/semver
      Hat ncoh jemand Ideen dafür? Tests muss ich sowieso noch machen.

      Edit:
      Ich habe auch noch eine ConsoleEx-Klasse, die noch nen paar Konsolensachen hinzufügt. Z. B. ReadLinePassword().
      Siehe: github.com/nikeee/nth/compare/console
      Auch hier bin ich für Änderungswünsche/Vorschläge offen.
      Von meinem iPhone gesendet

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nikeee13“ ()

      Könntest du die Namespaces nicht in System.X.Y umbennen? Dadurch würde sich deine Bibliothek noch bessere intigrieren. Kann natürlich sein, das du damit gegen Richtlinien verstößt und das deshalb nicht machen willst.
      Das könnte ich natürlich machen, aber damit würde ich gegen oben gannte Richtline verstoßen (was ich ohnehin schon mache, aber egal). Der SemVer-Standard schreibt allerdings auch vor, dass alle Versionen einer Software, die die gleiche Major-Version haben, abwärtskompatibel sein müssen. Ich kann also nicht einfach den Root-Namespace ändern, ohne die Library auf Version 2.0.0 anzuheben. Sowas würde ich mir dafür aufheben, wenn es wirklich nicht vermeidbar ist.
      Von meinem iPhone gesendet
      Ich habe mir mal erlaubt, ein paar Mathe-Funktionen aus der Sharpex-Library zu übernehmen (weil MIT).
      Commit(s):
      github.com/nikeee/nth/commit/a…b3287d6561732253ecabe5f47
      github.com/nikeee/nth/commit/8…f527fc0bddaed3d5e3345bb5a

      Ist noch in einem separaten Branch, da noch Unit Tests fehlen. Wenn @ThuCommix möchte, kann ich das auch wieder entfernen. Noch ist ja nichts in Stein gemeisselt.
      Von meinem iPhone gesendet
      Ich habe gerade die Version 1.2.0 veröffentlicht.

      Neu sind:
      • BitUtil-Klasse (siehe oben)
      • Adler32-Checksummen
      • Die SemVer-Klasse ist jetzt serialisierbar
      • IEnumerable.ForEach(action)
      • ConsoleEx.ReadLineMasked + Überladungen
      • Neue Funktionen in MathEx: GCD, LCM, Lerp, WrapAngle, ToDegrees/ToRadians
      • Bugfix bei long-überladung von Math.Pow
      • String-Funktionen: EnsureWrappingStrings, EnsureQuotes, EnsurePrefix, EnsureSuffix


      Generell habe ich viel Zeit in mehr Unit Tests gesteckt.

      Der komplette Diff seit der letzten Version ist hier:
      github.com/nikeee/nth/compare/v1.1.2...v1.2.0

      Edit:
      Ich habe auch noch eine Klasse angefangen, mit der man die Auslastung des Arbeitsspeichers auslesen kann. Die befindet sich momentan im memory-Branch:
      github.com/nikeee/nth/blob/mem…agnostics/MemoryStatus.cs

      Außerdem habe ich noch eine NTH-Library für Windows Forms-Anwendungen angefangen. Diese befindet sich dort:
      github.com/nikeee/NTH.Windows.Forms
      Gibt aber noch keinen Release davon. Ich nehme dafür hier auch Vorschläge an.
      Von meinem iPhone gesendet

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nikeee13“ ()

      Ich habe gerade die Version 1.3.0 veröffentlicht.
      Neu sind:
      • string.IsNewLine()
      • string.NormalizeNewLines()
      • string.NormalizeNewLines(newLine)
      • DateTime.ToUnixTime()
      • DateTimeEx.FromUnixToUtcDateTime(long/int)
      • DateTimeEx.FromUnixToLocalTime(long/int)


      Sie kann nun via NuGet runtergeladen werden. Alternativ gibt es auch bei den Releases die Binarys:
      github.com/nikeee/nth/releases

      Edit:
      Ist insgesamt nicht viel, da die größeren Erweiterungen noch in anderen Branches liegen und auf Tests warten...
      Von meinem iPhone gesendet

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nikeee13“ ()

      Ich habe mal noch 2 weitere Bibliotheken erstellt:
      • NTH.Framework
        Eine Library mit erweiterten Konzepten, die über simple Erweiterungen hinausgehen.
        Momentan enthalten:
        - DataStore-Struktur für eine Abstraktion von der Speicherung von Daten
        - Klasse für globale Windows-Hotkeys/Keyboardhook
        - Windows Mail API-Klasse, um das Default-Mail-Programm mit bestimmten Parametern zu nutzen

      • NTH.Windows.Forms
        Erweiterungen, die hauptsächlich Windows Forms betreffen. Dazu gehört momentan:
        - Controls: Explorer ListView, Vertikale Progressbar, Placeholder-Textbox, Guideline-komforme Standardform, Linklabels wie im Explorer
        - EnumWindows-Wrapper
        - FlashWindow-Wrapper
        - EnvironmentEx.IsDwmSupported/IsDwmEnabled

        Die Controls sind quasi nur noch mal aufbereitete Controls aus meiner HolzUI-Library, die ich bei HS benutze.


      Auch für diese Librarys nehme ich hier gerne Vorschläge an.
      Von meinem iPhone gesendet
      Moin,

      eine ListView mit Expandern bei den Gruppen könntest Du eventuell noch hinzufügen.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Hi,

      geht das über die WinAPI? Ich möchte nämlich ungerne Controls selber zeichnen, da das immer so viel Wartungsaufwand ist.
      Wenn du willst, kannst du es aber auch machen und mir einen PR schicken.
      Von meinem iPhone gesendet
      Jo, lässt sich darüber lösen.
      Ich werde morgen dann am Rechner einen entsprechenden PullRequest erstellen. Das kann man dann direkt in die Explorer-ListView integrieren.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: