Laden...

Forenbeiträge von trib Ingesamt 708 Beiträge

20.11.2019 - 16:13 Uhr

Das Problem liegt offenbar nicht an der Umwandlung des Enums.
Wie T-Virus schon schreibt, würde das nie funktionieren!
++
Im Umkehrschluss bedeutet das aber:++
Im Debug-Modus füllt der Konstruktor die Dictionary´s mit Werten. Deshalb läuft der Code gar nicht erst an diese Stelle.
In Release nicht, weshalb der cast fehlschlägt!

Die Frage wäre jetzt nach wie vor: Warum?

Anstelle des Cast auf Color habe ich nun

Color.FromName(colorName)

verwendet.
Funktioniert sofort und kann nach wie vor einfach mit einer Kompileranweisung (#if WindowsCE) für Windows CE kompilliert werden.

Das Problem ist also gelöst, danke an Euch beide! Interessieren würde mich die Unterscheidung aber trotzdem 😃

[EDIT]
Kopiert man den Code aus dem Xamarin-Projekt in eine Konsolenanwendung funktioniert er sowohl als Debug, als auch per Release.
Hängt also definitiv mit Xamarin zusammen, wo ich den Beitrag ursprünglich eingestellt habe.

20.11.2019 - 14:09 Uhr

Hallo zusammen,

ich übergebe eine Farbe als string an meine App.
Dort wird aus dem Enum System.Drawing.Color die passende Farbe herausgesucht und gesetzt.
Das funktioniert, sofern die App als Debug bereitgestellt wird.
Wird sie als Release kompiliert, erhalte ich folgende Meldung:

Fehlermeldung:
Type provided must be an Enum. Parameter name: enumType

Der entsprechende Code:
(Es handelt sich dabei noch um ein Relikt, welches Win CE kompatibel ist. Es gibt sicherlich mittlerweile elegantere Umsetzungen)

    public static class Colors
    {
        public static readonly Dictionary<Color, string> ColorNames = new Dictionary<Color, string>();
        public static readonly Dictionary<string, Color> ColorValues = new Dictionary<string, Color>();

        static Colors()
        {
            var fi = typeof(Color).GetFields(BindingFlags.Static | BindingFlags.Public);
            for (var iEnum = 0; iEnum < fi.Length; iEnum++)
            {
                AddColor(fi[iEnum].Name, (Color)fi[iEnum].GetValue(null));
            }
            var pi = typeof(Color).GetProperties(BindingFlags.Static | BindingFlags.Public);
            for (var iEnum = 0; iEnum < pi.Length; iEnum++)
            {
                if (pi[iEnum].PropertyType == typeof(Color))
                {
                    AddColor(pi[iEnum].Name, (Color)pi[iEnum].GetValue(null, null));
                }
            }
            pi = typeof(SystemColors).GetProperties(BindingFlags.Static | BindingFlags.Public);
            for (var iEnum = 0; iEnum < pi.Length; iEnum++)
            {
                if (pi[iEnum].PropertyType == typeof(Color))
                {
                    AddColor(pi[iEnum].Name,(Color)pi[iEnum].GetValue(null, null));
                }
            }
        }

        private static void AddColor(string name, Color color)
        {
            if (ColorNames.ContainsKey(color))
                return;
            //Not supported:
            if (color == Color.Transparent)
                return;
            ColorNames.Add(color, name);
            ColorValues.Add(name, color);
        }

        public static string ColorToString(Color color)
        {
            string name;
            if (!ColorNames.TryGetValue(color, out name))
            {
                name = "Empty";
            }
            return name;
        }

        public static Color StringToColor(string colorName)
        {
            Color color;
            if (ColorValues.TryGetValue(colorName, out color))
                return color;
            if (ColorValues.TryGetValue(string.Format("Color [{0}]", colorName), out color))
                return color;
            try
            {
                color = (Color)Enum.Parse(typeof(Color), colorName, true);
            }
            catch (Exception ex)
            {
                MessageMgt.CaptureError(ex.Message, "Color " + colorName);
                color = Color.Empty;
            }
            return color;
        }
    }

Der Fehler tritt bei

Enum.Parse(typeof(Color), colorName, true);

auf. Z.B. wenn man "Green" oder "AliceBlue" übergibt.

Der Debugger hilft mir dabei leider nicht weiter, da der Fehler schließlich nur auftritt, wenn ich ohne Debug-Informationen kompiliere.

Hätte jemand eine Idee woran das liegen könnte?
Oder wie ich es selbst herausfinden kann?

18.10.2019 - 08:49 Uhr

Hi,

das Problem mit der Seitenanzahl ist, dass diese erst beim Rendern feststeht. Das kann zu unterschiedlichen Verhalten führen und ist nicht verlässlich.
Was Du machen kannst ist, die Rechnung und den Text in verschiedenen Containern darzustellen.
Die Rechnungsdaten in einer Tabelle und den Text in einer DetailView oder wie das Teil heißt. (Habe gerade kein VS mit Reporting zur Hand) Dort kannst Du über die Properties steuern, ob Du pro Datensatz eine neue Seite haben möchtest.
Ggf. musst Du den Text dann filtern oder per First() einschränken, damit dieser nicht genauso oft angezeigt wird, wie es Rechnungszeilen gibt.

09.09.2019 - 09:28 Uhr

Hallo Rafael,

ein & liefert nur dann eine 1, wenn beide eingehenden bits ebenfalls 1 entsprechen.
Leider rückt Dein Programm die binäre Darstellung nicht ein.

60: 00111100 13: 00001101 ____________

Nun kannst Du wie bei einer Addition die Spalten untereinander übernehmen, wo in beiden eine 1 drin steht. Der Rest bleibt 0.
Das ergibt die binäre Darstellung von 12. Eine 1 bei 4 und eine weitere bei 8.

09.08.2019 - 09:17 Uhr

Hi Abt,

danke für Deine Rückmeldung!
Der Webservice lief ja grundsätzlich ohne Proxy. Bis gestern Abend, dann bekam ich auch auf einmal auch ohne die Meldung.
Habe den Server neugestartet und seit dem geht es!

Bin gerade dabei an das Log von gestern Abend zu kommen. Ist nicht so einfach per Powershell den tausenden Einträgen in der Konsole Herr zu werden.

Parallel teste ich weiter mit dem Proxy und schaue ob die Meldung überhaupt nochmal auftritt.

08.08.2019 - 16:13 Uhr

Hallo zusammen,

ich habe ein seltsames Verhalten.
Eine Android App verbindet sich mit einem Webservice.
Der Contenttype wird dort hinterlegt:

var httpContent = new StringContent(soapEnvelop.ToString(), Encoding.UTF8, "text/xml");
httpContent.Headers.Add("SOAPAction", soapAction);

Das funktioniert verlässlich!

Route ich nun den Webservice über einen WCF-Proxy, erhalte ich regelmäßig die Meldung > Fehlermeldung:

Client found response content type of '', but expected 'text/xml' Fehlermeldung:
Der vom Client gefundene Anforderungsinhaltstyp ist '', erwartet wurde 'text/xml'.

Schaue ich dort in das Webservice_Binding Objekt (Wurde klassisch als Webservice referenziert), ist der Content-Type auch dort korrekt als "text/xml" enthalten.

Es klappt zwei mal, dann wieder nicht. Dann bekomme ich 3-4 mal den Fehler und auf einmal geht es wieder.

Am Ende hängt ein Webservice einer Cloud-Anwendung, die ich leider nicht debuggen kann.
WireShark zeigt mir sauber die Anfrage der Android-App zum Proxy und die Antwort vom Proxy zurück an.
Die Anfrage an den WS in der Cloud ist nicht per http, sondern per TLS, somit ist der ContentType "Application Data" und die Daten sind natürlich verschlüsselt.

Funktioniert die Anfrage, so sieht man vorab den Handshake. Schlägt sie fehl, fehlt der Handshake. Bei einer Keepalive-Nachricht eigentlich auch nichts ungewöhnliches.

Habe gerade keine Ahnung wie ich das weiter analysieren kann.
Vielleicht hat jemand von Euch eine Idee 😃

22.07.2019 - 17:22 Uhr

Hallo zusammen,

ich habe nun endlich mein "Problem" ausfindig gemacht!
Meine Controls füge ich per Code hinzu. Mache ich es wie Urza (Danke dafür!) im XAML, klappt es natürlich.

Also freudig alles auskommentiert, was keine Miete zahlt und Label + Entry sind nach wie vor nicht auf einer Y-Achse...

Nun habe ich die entscheidende Stelle endlich gefunden:
Es lag am HeightRequest!

Da ich meine Canvas pixelgenau in einem anderen Tool generiere, füge ich alle Controls untereinander ein und setze den Heigth- & Width-Request + ein Margin für den Abstand.
Bei Controls auf der selben Y-Achse verwende ich ein zusätzliches StackLayout.

Nun setze ich den HeightRequest im StackLayout und das Label nur auf "Center". Klappt solang ich keine Hintergrundfarbe setze. Dann fällt nämlich auf, dass das Edit-Control die volle Höhe einnimmt und das Label nur die des anzuzeigenden Textes.

Lange Rede kurzer Sinn: Ist das Label zentriert und die Höhe errechnet sich selbst, funktioniert es.
Übergibt man eine gewünschte Höhe oder stretcht diese, funktioniert es nicht mehr.

02.07.2019 - 17:27 Uhr

Hmm, das ist seltsam. Bei mir nicht!

Beides auf Center und der Label-Text ist am oberen Rand orientiert. Also etwas höher als "STÜCK".
Setze ich beim Label nun VerticalTextAlignment = TextAlignment.Center kommt es zu dem Verhalten auf meinem Screenshot.

Schnell mal eine Test-View mit einem Grid zusammengeschustert und es sieht gut aus!
Also muss es wohl an meinem Stacklayout liegen. Dort alle Eigenschaften außer Horizontal und LeftToRight auskommentiert. Immer noch das selbe 😕
Werde mich morgen nochmal von null an vorankämpfen. Muss ja irgendwo dran liegen!

02.07.2019 - 15:38 Uhr

Hallo zusammen,

ich versuche ein Label und ein Entry nebeneinander darzustellen.
Das Problem ist aber, dass der Text nicht auf der selben Höhe ist und es deshalb ziemlich bescheiden aussieht.

Beim Label kann ich mit dem VerticalTextAlignment zwar zwischen Start, Center & End unterscheiden, aber nichts davon befindet sich auf Höhe des Entry-Textes.
Bei dem Entry selbst gibt es kein Property um das Alignment des Textes zu definieren.
Natürlich kann man nun mit einem Custom Renderer das Entry individualisieren. Aber das kann doch nicht Sinn und Zweck sein, oder?

Unter UWP ist das Entry umrahmt. Da ist der Text zwar ebenfalls nicht auf der Höhe, jedoch fällt es nicht mehr ganz so ins Auge, da das Label wenigstens zentriert zur Textbox ist.

Die Controls liegen beide auf einem StackLayout mit horizontaler Orientierung. Beide haben die identische Höhe und die VerticalOptions stehen auf StartAndExpand.

13.05.2019 - 09:33 Uhr

Da kommt man nichts ahnend aus dem Urlaub zurück und stellt fest:
Nix!

So muss ein Umzug laufen! Klasse Arbeit & Danke 😃

13.03.2019 - 12:44 Uhr

Selbiges Verhalten ist bei einem Kollegen auch aufgetreten. Neuaufsatz eines Win10 Rechners mit letztem Build und seine WPF Anwendung funktionierte nicht mehr.
Auf allen anderen Win10 PC´s lief sie weiterhin.

Seine Rückmeldung:

Nach einer langen Google-Recherche kam heraus, dass es ein DirectX Problem bei Windows 10 gibt.
Abhilfe ist in der Regel den Grafikarten Treiber nachzuinstallieren, und auf einmal geht alles wieder!

Vielleicht hilft´s ja.

23.01.2019 - 17:48 Uhr

D.h. wenn Dein Kunde pauschal eine Anforderung hat, die Du selbst als unsicher einstufst, dann machst Du das? Du bückst Dich also immer, weil der Kunde das will?

Das ist natürlich arg pauschalisiert.
Weder springe ich von der Brücke, noch erfinde ich das Rad neu 8)

Ist man in der komfortablen Situation Interessenten ablehnen zu können, sollte man das durchaus tun, wenn man selbst keinen Nutzen daraus zieht. In einem Angestelltenverhältnis geht das jedoch nicht immer.

Manches muss man auch einfach als Herausforderung ansehen 😁

Natürlich habe ich schon potentiell unsichere Umsetzungen abgelehnt, aber auch (für teilweise viel Geld) vollkommen sinnlose/überflüssige Dinge umgesetzt.
Dabei agiere ich transparent und weise den Kunden auf meine Bedenken hin. Mehrfach. Möchte er das trotzdem, gibt es selten Gründe das abzulehnen und ihn zum Mitbewerbern zu schicken.

Bin mir aber sicher, dass wir uns da im Großen und Ganzen ohnehin recht einig sind 🙂

23.01.2019 - 14:48 Uhr

Auch das ist - wie zB bei Maschinenbauern und Automobilkonzernen - ein rein politsches Thema.

Das spielt doch überhaupt keine Rolle.
Wenn Dein (potentieller) Kunde sagt, Du darfst das nicht, dann hältst Du Dich daran oder suchst Dir einen anderen Kunden (Bzw. der Kunde einen anderen Dienstleister).

Und ob ein Unternehmen sich noch im Dornröschenschlaf befindet, ändert ebenfalls nichts an der Tatsache, dass er nun mal am längeren Hebel sitzt.
Die allermeisten Spendenorganisationen haben in der Satzung stehen, dass die Daten im eigenen Haus verbleiben müssen. Also keine Cloud, teilweise keine Remote-Zugänge, niemals externe Datensicherungen, usw.
Ob das sinnvoll ist, steht auf einem anderen Blatt. Aber wenn Du nur Cloud aus dem Homeoffice anbietest, bist Du als Dienstleister raus.

Obwohl man davon ausgehen kann, dass ein Ausfall nicht oft vorkommt, sind die Schäden jedoch zu hoch, um auf ein Fallback zu verzichten.

Kommt alles auf den Prozess an!

Wir haben Lösungen, die nur die essenziellen Daten offline vorhalten, bis die Software wieder online ist. Z.B. einen Verkauf. Wenn der Kunde den Artikel in der Hand hält, ist dieser per se lagerhaltungstechnisch auch verfügbar. Ist man wieder online, wird die Entnahme verbucht.
Alles andere geht eben für diese Zeit nicht oder muss auf Papier erfasst und nachgepflegt werden.
Ist ja auch eine Sache des Aufwandes, die der Kunde zu zahlen hat.

Der "große wirtschaftlicher Schaden" kann immer und überall entstehen, wie man schon häufiger mal an Tankstellen gesehen hat. Da verwechselt der Fallback mal eben einen Punkt mit einem Komma und der Sprit kostet nur noch 1,49 Cent 😁

Ist aber auch alles sehr theoretisch, da wir/ich nicht weiß was das System letztendlich können soll.

23.01.2019 - 09:41 Uhr

Die Problematik kenne ich zur genüge!

Die Frage ist aber: Wird diese Offline-Fähigkeit wirklich benötigt oder ist das nur ein theoretischer Fallback, den der Kunde gerne hätte?

Denn, wie häufig fällt die Internetverbindung tatsächlich aus?
Sind die Geschäftsprozesse wirklich nicht temporär offline durchführbar? (Lagerentnahme mit Entnahmeschein [so wie früher auch]).

Kritisches Thema sind meist Abrechnungssysteme (Kassen). Was kostet ein USB-UMTS-Stick? Oder einen Hotspot mit dem Handy aufzumachen?

Eine Sache gibt es, die mir AdHoc einfällt, wo es wirklich nicht anders geht:
Wartung bei Großkonzernen, die in der Forschung tätig sind. Neben jeglicher Art von Kameras (also Smartphones) ist auch meist keine Netzwerk-/Internetverbindung erlaubt.
Dort sucht der Mitarbeiter den Wartungsauftrag raus, macht ihn offline verfügbar und sperrt diesen im online-System.
Kommt er vom Kunden zurück, kann er problemlos diesen Auftrag aufgrund seiner Sperre wieder zurücksynchronisieren.

06.12.2018 - 09:41 Uhr

Danke für den Test emuuu. Da habe ich (zumindest in der Vergangenheit) andere Erfahrungen gemacht.
Da hatte ich entweder eine andere Konstellation oder ggf. eine andere SQL Version im Einsatz.

Wir nutzen für eindeutige IDs, was der ursprungszwecke von auto increment ist, nur Guid.

Der Horror einer jeden Tabelle: 32 stellige Primärschlüssel!
Die Sortierung passiert willkürlich, es müssen die Datensätze also laufend "dazwischen" eingefügt werden, was ebenfalls extrem schlecht für die Performance und Festplatte ist.
Mit dieser Sortierung kann niemand etwas anfangen. Daher braucht es mindestens einen Sekundärschlüssel, der die Daten nach einer sinnvollen Reihenfolge ausgeben kann.
Jede Applikation, die die Daten bereitstellen möchte, muss die Sortierung auf den SK ändern, wenn die Daten linear angezeigt werden sollen.

Bin mir ziemlich sicher, dass es performanter wäre, mit LOCK den letzten Datensatz zu holen und den Wert zu inkrementieren (also ein "händisches" autoincrement aber mit LOCK) als eine GUID für den PK zu verwenden.

04.12.2018 - 22:16 Uhr

Da bin ich ganz anderer Meinung.
AutoIncrement basiert auf einem Feld in einer Shadow-Tabelle. Dieses wird hochgezählt und damit sehr performant der PK für die Tabelle erstellt. Diese schert sich nicht um Daten innerhalb der Tabelle. Deshalb werden Datensätze dann einfach überschrieben, bzw. ruft jeder Insert einen Fehler hervor, dass der Datensatz bereits existiert.

Also ja, setze nach einer Datenübernahme den AutoIncrement Wert auf den PK Deiner Tabelle. Da der PK noch nicht existiert, kannst Du das eigentlich mit
IDENTITY(X,1) machen. Wobei X für den Startwert und die 1 für die Erhöhung steht.

14.11.2018 - 11:22 Uhr

Das funktioniert vor allem in der Theorie.
In der Praxis ist bei Xamarin trotzdem noch (oft) plattformspezifischer Code im Sinne von Java oder Swift notwendig.

Das kommt letztendlich, so wie Deine anderen genannten Argumente, auf den Anwendungsfall an.
Bei meinem Projekt komme ich zu 99% mit einem Basiscode aus und das restliche Prozent verteilt sich auf die Android, iOS & UWP spezifischen Dinge in Xamarin.
Bisher KeyDown-Events & Versions/Build-nummer beziehen. Finde ich verschmerzbar.

Meine Anwendung verwaltet aber auch nur ein paar Verbindungsdaten und erzeugt die GUI dynamisch.
Der erste Prototyp stand nach 2 Tagen für alle drei Betriebssysteme. Kann mir schwer vorstellen, dass es ein anderes System ähnlich einfach macht*.

Sobald es in Richtung grafisch aufwendiger Apps geht, oder gar Spiele, reicht Xamarin sicherlich nicht aus. Aber für ein bisschen Webservices und Daten austauschen, allemale.

*Einfach bedeutet im Umkehrschluss auch immer eingeschränkt. Mit PowerApps kann ich sogar in 2 Minuten eine App für Android, iOS, UWP & alle gängigen Browser bauen. Dafür ist die Einschränkung immens!
Dennoch gibt es viele Anwendungsfälle, wo das ausreicht. Der Topf muss eben zum Deckel passen 😃

13.11.2018 - 10:10 Uhr

Xamarin ist der Weg.
MS hat Mono übernommen und mehr oder weniger mit dem .Net Standard Framework ersetzt/ergänzt.
Du kannst mit einem Code iOS, Android und UWP Apps erstellen. Das funktioniert ganz gut, erfordert aber (wie so oft) einiges an Zeit zum einarbeiten und verstehen.

Zu der RAM Auslastung kann ich gerade nicht viel sagen, da mein vorsteinzeitliches Demo-Gerät Android 4.1 installiert hat und ich nur die Gesamtauslastung (360mb) und ein paar System-Apps (~180mb) sehe. Stoppe ich die App, bleiben 340mb über. Spricht also für 20mb im USB Debug-Modus. Wird in der Realität als Release dann wohl nochmal weniger werden. Verlässlich ist der Wert jetzt aber nicht gerade.

29.10.2018 - 11:40 Uhr

Guten Morgen,
danke für Eure Antworten.

warum erstellst du dir da nicht einen eigenen Converter für JSON.NET ?

Da ich erstens verstehen möchte weshalb der selbe Code nacheinander ein anderes Verhalten zeigt und zweitens wollte ich gerne vermeiden, dass ich die Properties der Klasse kennen muss. Sprich das Feld "Id".
Am Converter wird aber letztendlich wohl wenig vorbeiführen.

Wenn du unbedingt mit Reflection arbeiten willst, dann kannst du die Properties doch einfach sortieren, bevor du den Json String zusammenbaust (Abgesehen davon, dass strings mit += zusammensetzen gerade in schleifen problematisch ist).

Wo kommt diese These her? Dachte eigentlich die Stelle "Der Code stark vereinfacht:" und die auskommentierten Zeilen, die auf JSON.Net hinweisen, reichen aus um darzustellen, dass es hierbei nur um das Prinzip, um Beispielcode geht.

Aber auch LaTinos Aussage lässt darauf schließen, dass dem offenbar nicht so ist.

@gfoidl: Danke, dass sind exakt die Info´s die ich gesucht habe, bzw. die aus der MSDN für GetProperties() nicht hervorgegangen sind.

26.10.2018 - 17:32 Uhr

Hallo zusammen,

ich habe gerade ein Phänomen, welches ich nicht so recht nachvollziehen kann.

Eine Klasse erbt von einer Anderen und wird serialisiert.
Beim ersten Durchlauf werden zuerst die Eigenschaften der Basisklasse und dann die der abgeleiteten Klasse verarbeitet.
Ab dem folgenden Durchlauf genau andersherum.

Dass obj.GetType().GetProperties() weder Alphabetisch, noch in der Reihenfolge der Initialisierung durchlaufen wird, sagt ja schon die MSDN.
Dennoch bin ich verwundert, dass es unterschiedlich passiert.

Hintergrund ist, dass leider die Seite, die mein serialisiertes Json entgegen nimmt, auf das allererste Element angewiesen ist.

Der Code stark vereinfacht:


using System;
using System.Reflection;
using System.Xml.Serialization;

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            var t = new Test();
            Console.ReadKey();
        }
    }

    public class Test
    {
        private DerivedClass derivedClass;
        public Test()
        {
            RunFirstTest();
            RunSecondTest();
            RunThirdTest();
            RunFourthTest();
        }

        public void RunFirstTest()
        {
            derivedClass = new DerivedClass();
            derivedClass.TestValue = "Test1";
            var baseClass = new BaseClass(derivedClass);
            baseClass.Id = "1";
            Console.WriteLine(Json.Serialize(baseClass));
        }

        public void RunSecondTest()
        {
            derivedClass.TestValue = "Test2";
            var baseClass = new BaseClass(derivedClass);
            baseClass.Id = "2";
            Console.WriteLine(Json.Serialize(baseClass));
        }

        public void RunThirdTest()
        {
            derivedClass = new DerivedClass();
            derivedClass.TestValue = "Test3";
            var baseClass = new BaseClass(derivedClass);
            baseClass.Id = "3";
            Console.WriteLine(Json.Serialize(baseClass));
        }

        public void RunFourthTest()
        {
            var derivedClass2 = new DerivedClass();
            derivedClass2.TestValue = "Test3";
            var baseClass = new BaseClass(derivedClass2);
            baseClass.Id = "3";
            Console.WriteLine(Json.Serialize(baseClass));
        }
    }

    public class DerivedClass
    {
        private string _testValue = string.Empty;
        public string TestValue
        {
            get { return _testValue; }
            set { _testValue = value; }
        }
    }

    public class BaseClass : DerivedClass
    {
        public BaseClass()
        {
        }

        public BaseClass(DerivedClass derivedClass)
        {
            foreach (PropertyInfo sourcePropertyInfo in derivedClass.GetType().GetProperties())
            {
                var destPropertyInfo = GetType().GetProperty(sourcePropertyInfo.Name);
                if (destPropertyInfo != null && destPropertyInfo.CanWrite)
                    destPropertyInfo.SetValue(
                        this,
                        sourcePropertyInfo.GetValue(derivedClass, null),
                        null);

            }
        }
        private string _id = string.Empty;
        public string Id
        {
            get { return _id; }
            set { _id = value; }
        }
    }

    public static class Json
    {
        public static string Serialize(object obj)
        {
            //var jObject = new JObject();
            var json = string.Empty;
            foreach (var propertyInfo in obj.GetType().GetProperties())
            {
                if (propertyInfo.IsDefined(typeof(XmlIgnoreAttribute), false))
                    continue;

                var value = propertyInfo.GetValue(obj);
                var name = propertyInfo.Name;
                //jObject.Add(name, JToken.FromObject(value));
                json += $"{name}\t{value}" + Environment.NewLine;
            }

            //var json = jObject.ToString();
            return json;
        }
    }
}

Ausgabe:
Test 1: ID, TestValue
Test 2: TestValue, ID
Test 3: TestValue, ID
Test 4: TestValue, ID

Dass ich die "DerivedClass" global vorhalte, könnte das erklären. Dann hätte aber Test4 wieder identisch zu Test1 laufen müssen?!?

Bonus Info: Unter Xamarin Android startet die Ausgabe immer mit ID, in einer Console oder Xamarin UWP kommt es zu o.g. Verhalten.

Über die Implementierung der Gegenseite müssen wir nicht sprechen. Da habe ich leider keinen Einfluss drauf 😦

08.10.2018 - 09:51 Uhr

Pre-Post: panicJonny war schneller, aber ich denke ich bin eine Idee ausführlicher 😉

Wo schmeiße ich denn den Inhalt weg?

Hier:

  private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            /*  Puffer anlegen..
            */
            byte[] buffer = new byte[ 50 ];

Du erstellst den Puffer innerhalb des Datenempfangs.

Wenn Du nun erwartest, dass "Test123" eingeht, der Port aber schnell genug reagiert, kommt nur "Tes" an und in dem nächsten ausgelösten Event "t123".
Beides ist von der Länge her kleiner als Deine erwarteten Daten. Also springst Du aus der Methode und die Daten sind futsch.

Eine mögliche Lösung ist es einen Empfangspuffer außerhalb Deiner Methode anzulegen und solange zusammensetzen, bis Deine Länge erreicht ist. Dann kannst Du diesen auswerten und wieder löschen.

Zum Aufbau:
Verwende eine eigene Klasse, die sich genau um das o.g. kümmert. Lerne wie man selbst Events erstellt und nutze es, wenn Deine Daten komplett sind.
Erstelle Dir eine Daten-Klasse, die Deine Werte beinhaltet und verknüpfe diese per Databinding an die Controls.
Nun füllst/änderst Du den Wert in Deiner Datenklasse aus dem Event aus Deiner SerialPort-Klasse mit der Pufferungs-Logik.

05.10.2018 - 13:23 Uhr

Hallo schuppsl,

i.d.R. können QR-Code Leser konfiguriert werden.
In der Bedienungsanleitung stehen bestimmte Codes, mit denen das Gerät "programmiert" werden kann. So z.B. auch Start- & Endzeichen oder feste Prefixe/Suffixe.
Das könnte Dir helfen, dass Du die Scanner eindeutig identifizierbar machen kannst.

Ein Programm kann per globalen KeyHooks (Dein Stichwort für die Recherche) auf Tastatureingaben lauschen, auch ohne dass das Programm ein Eingabefeld hat oder gar im Vordergrund ist.
Ein Dienstprogramm kann imho per se nicht auf die Tastatureingaben zugreifen. Daher müsstest Du eine normale Applikation erstellen und diese dann minimiert starten (bzw. mithilfe des NotifyIcon).

29.08.2018 - 14:02 Uhr

Windows CE als auch Embedded ist zu 2020 abgekündigt.
Bzw. ist daran in der Vergangenheit ja ohnehin nicht mehr viel passiert und die Geräte teilweise immer noch langsamer als ein handelsüblicher Taschenrechner.

Stand aber auch vor selbigem Problem und habe eine Serverseitige Anwendung geschaffen, die dem CE/Embedded/Mobile Gerät die Oberfläche komplett zur Verfügung stellt.
Also alle Labels und Textboxen mit Werten und Positionsangaben übermittelt werden. Auf dem Gerät werden dann die Eingaben gemacht und bestimmte Controls können als "Sender" definiert werden. Dann wird alles wieder zusammengepackt und an den Server zurück übermittelt werden.
Ohne Performance-Optimierung und zahlreichen Verbesserungen für Look&Feel und kleineren Prüfungen, damit nur valide Daten übermittelt werden, machste sowas in 2 Tagen.

Jetzt portiere ich das gerade nach Xamarin. An der Serveranwendung muss ich dafür nullkommanix machen.

22.08.2018 - 10:55 Uhr

@Abt: Dein Style gefällt mir nicht. Wenn sich das nicht ändert, werde ich da nicht drauf eingehen.

Vielleicht gehst Du vorher nochmal in Dich und hinterfragst, wer hier versucht wem zu helfen.

06.08.2018 - 15:50 Uhr

Hallo zusammen,

ich möchte gerne eine ziemlich simple Anwendung schreiben, die prinzipiell nur aus ein paar Buttons besteht und Befehle per Bluetooth versendet.
Das Empfangsgerät ist bereits (mit dem PC oder Handy) gepairt und muss nur einmalig ausgewählt werden.
Verwenden möchte ich daher gerne Xamarin Forms mit .NET Standard 2.0.
Dann hätte ich nur einen Basis-Code und Views.

Es gibt offenbar keine allgemeingültige Bluetooth-Schnittstelle und soweit ich recherchieren konnte, muss ich pro Betriebssystem eine separate Schnittstelle verwenden.
Das spräche ja eher für eine Shared Projektmappe.

Hat jemand von Euch bereits BT in Forms im Einsatz und wenn ja, wie gelöst?

Es gibt ein paar NuGet Pakete, die meisten sind aber shared und kombinieren nur Android und iOS.

12.06.2018 - 13:31 Uhr

Vereinfacht ausgedrückt ist ein DateTime nichts anderes als ein Int64. Also eine einfache Ganzzahl.
Es beginnt bei 0, was dem 1.1.0001 00:00:00.0000 entspricht.

Ein Datum wir dann simpel in "Ticks" gespeichert. Eine Einheit, genauer als Millisekunden -Sollte aber prinzipiell keine Rolle spielen- Die laufend hochgezählt wird.

Erst wenn z.B. ToString aufgerufen wird, erweckst Du diese Zahl, abhängig der Zeitzone oder des Übergabeparameters zum Leben.

Übergibst Du die DateTime-Variable einem anderen Programm, muss Du Dich um nichts kümmern. Es wird der Integerwert übergeben. Exportierst Du sie in eine Datei, wird sie mit ToString (Oder ToShortDateTime, ect.) formatiert.

08.06.2018 - 09:17 Uhr

Gestern auf LinkedIn habe ich die zu erwartenden Ausbaustufe gefunden, die mit dem Wachstum der Technologien einhergeht.
Schockierend ist eine nette Untertreibung:
LinkedIn
YouTube

Die Schüler werden ganztägig überwacht, die Meldungen gezählt, sind sie müde, gelangweilt, aufmerksam... Theoretisch kann man das gesamte (mündliche) Notensystem einem Computer übergeben.

07.06.2018 - 15:27 Uhr

Die Diskussion driftet ja in mehrere Richtungen ab.
Unter anderem geht es hier nicht um die Videoaufzeichnung, sondern um die Live-Gesichtserkennung. (Abt war schneller mit dieser Erkenntnis)
Theoretisch kann jeder Mensch unerkannt an diesen Kameras vorbei laufen und wird nicht aufgezeichnet.
Nur wessen biometrische Daten in das System geladen wurden, wird erkannt und gemeldet. Unter genau dieser Prämisse finde ich diese Lösung gar nicht so schlecht.

Natürlich möchte auch ich nicht 24/7 überwacht und aufgezeichnet werden! Ein Generalverdacht ist immer der falsche Weg und eröffnet mehr negative als positive Aspekte. Man siehe die Vorratsdatenspeicherung.

Sollte das System aber "nur" den Abgleich mit einer fest definierten Liste von Personen, die richterlich angeordnet wurde abgleicht, ziehe ich solch eine "stille" Fahndung einer öffentlichen Fahndung vor. Gerade zu Zeiten wo jeder irgendwelche ominösen Bilder auf Facebook teilt, um vermeintliche Verbrecher aufzufinden.

Erinnern wir uns an die letzten Terroranschläge, so waren die meisten Personen polizeibekannt und sog. Gefährder. Diese konnten aber nicht lückenlos überwacht werden, da dies pro Tag bis zu 15 (!!!) Beamte erfordern würde.

Problematisch ist natürlich wie und von wem solche Systeme eingesetzt werden. Welche Grenzen und Gesetze existieren? Können diese künftig umgangen werden? Gibt es Interessen aus z.B. Wirtschaft, die sich lobbyistisch einmischen können?

Wie in erschreckend kurzer Zeit ein demokratisches System in einen totalitären Staat gewandelt werden kann, sehen wir in der Türkei. Würde dort ein solches System existieren, wäre Orwell´s Vision übertroffen worden. Ob das überall (auch in Deutschland) auszuschließen ist, wage ich zu bezweifeln. Momentan gibt es auch hier einen Politischen Ruck, den sich nach der NS-Zeit niemand mehr hätte vorstellen können.

11.05.2018 - 10:12 Uhr

Hallo p!lle,

dank Dir für Deine Unterstützung!
Die Meldung bleibt leider die selbe. Bzw. bezieht sie sich dann auf die in der Minimum-Version eingestellten Android Version.
Für mich sieht das so aus, als ob Xamarin (in Form der FormsViewGroup.dll, Platform.dll & Android.dll) nur in der 8.0 Version vorliegt und sobald ich eine niedrigere Android Version auswähle, er meckert.
Habe jetzt einfach mal MS angefragt, die konnten das nachstellen und schauen mal ob es sich um einen Bug in VS handelt.

07.05.2018 - 16:09 Uhr

Die steht analog zu den Projekt-Einstellungen auf:

<TargetFrameworkVersion>v7.1</TargetFrameworkVersion>

Die Meldung kommt trotzdem. Spielt auch keine Rolle, ob ich irgendwas anderes in den "Compile using Android Version: (Target Framework) und den Min- & Target Version Einstellungen etwas ändere.

Wie gesagt, das wahr wohl von 6.0 auf 7.0 schonmal ein Problem und wurde mit einem VS Update behoben. Alles dazu ist aber von ~2017 und mein VS 15.6.6 bereits deutlich aktueller.

07.05.2018 - 14:55 Uhr

Hallo zusammen,

ich habe mir eine neue VM aufgesetzt mit Win10 und VS 2017.
Erstelle ich dort nun ein neues Xamarin-Projekt, werden die Resourcen für Android 8 verknüpft, der Emulator ist aber nur bis 7.1 installiert.
Bisher habe ich keine Möglichkeit gefunden, die Xamarin-Version zu "downgraden". Nachinstallieren des Android 8 Emulators hat nach einigen Versuchen zwar funktioniert, er friert aber unmittelbar ein und die (leere) App startet nicht.

Die Meldung, wenn ich eine niedrigere Version auswähle, scheint früher mal auf einen Bug hingedeutet zu haben. Das ist aber zahlreiche VS-Versionen her!

The $(TargetFrameworkVersion) for FormsViewGroup.dll (vv8.0) is greater than the $(TargetFrameworkVersion) for your project (v7.1). You need to increase the $(TargetFrameworkVersion) for your project.	XamarinMobileApp.Android	C:\Visual Studio Projects\XamarinMobileApp\XamarinMobileApp\XamarinMobileApp.Android\XamarinMobileApp.Android.csproj

Wie kann ich Xamarin für z.B. Android 6 oder 7 verwenden? In den Xamarin Objekten konnte ich keine Versionen <8.0 ausmachen.

Für einen Tipp wäre ich sehr dankbar!

07.05.2018 - 09:23 Uhr

Alle Schnittstellen, die von der HoloLense verwendet werden, kannst Du auch per API ansprechen. Daher sollte die Verwendung der Speech-API problemlos die Befehlseingabe ermöglichen.
Der Rest klingt für mich nach der Anzeige/Aufzeichnung eines Videos, und wenn der Anwender dies wünscht, ein Foto aufnimmt.
Klingt nach einem machbaren Szenario, auch für Einsteiger.

Teil die Anforderungen auf, in Spracheingabe, Videoverarbeitung und Dein Tool mit GUI (Notenanzeige, Speicherung, Teile-Datenbank, usw.).

Die Idee dazu eine HoloLense zu verwenden ist natürlich toll, aber recht teuer und imho aktuell nur als Insider zu erwerben.

04.05.2018 - 10:51 Uhr

Hallo herbivore,

Dein Beispiel ist sicherlich die Parade für einen Upload-Filter.
Jeder kann nachvollziehen, dass dies für Betroffene hilfreich ist.

Das muss aber erstmal beantragt & nachgewiesen werden. Bis diese Mühlen mahlen, haben sich andere Kanäle gefunden, die eine Verbreitung ermöglichen. Messenger, die zum Teil mit Ende zu Ende Verschlüsselungen eine Filterung per se nicht ermöglichen.

Dann passiert, was immer passiert:
Firmen beanspruchen die Filterung für sich und Zweckentfremden den Nutzen.

Privatpersonen verwenden Alternativen um z.B. ein Video an eine Whatsapp/Telegramm/Threema/ect.-Gruppe zu verschicken.

Irgendwann meldet sich ein bayrischer Minister mit der Idee, diese Filterung doch auch für weitere Zwecke, wie z.B. die Suche nach Flüchtigen nutzen zu wollen. Verbotene Dinge (Drogen, Waffen, ect.) im Hintergrund auf Fotos zu analysieren.
(Aktuell vielleicht noch etwas weit hergeholt)

Das Resultat ist eine Instanz, die nicht mehr dem Zweck dient, sondern Unternehmen und Politikern. Die können im Gegensatz zu den schutzbedürftigen Privatpersonen nämlich Druck ausüben.
Leider ist das in meinen Augen die realistischste Entwicklung dieses UploadFilters und deshalb bin ich dagegen. Auch wenn es mir für die betroffenen von Hetz-Kampagnen, Cyber-Mobbing oder Rache sehr leid tut. Es wird keine Abhilfe schaffen!

13.04.2018 - 13:50 Uhr

Wir haben damals uns die Arbeiten der Vorjahre runtergeladen, von vorigen Lehrjahren besorgt und teilweise sogar im Unterricht durchgearbeitet.

Dort konnte man ziemlich genau erkennen, wie sich die Prüfungen entwickelt haben. Zum einen wurde penibel darauf geachtet, Fragen aus den Vorjahren nicht zu übernehmen. Und wenn doch, dann waren die mindestens 5 Jahre alt und stark abgewandelt.
Hilft also nur um ein Gefühl für die Art und Weise der Fragenstellungen zu bekommen.

Eine weitere Tendenz war, dass die Fragen so gestellt wurden, dass man sie mit dem Informatiker-Buch nicht beantworten kann. Mir hat das zumindest kaum bis garnicht weiter geholfen. Denke die prüfen ob die Schlagworte im Inhaltsverzeichnis vorkommen...

Persönlich fand ich die Prüfung schlecht und Praxisfern. "Programmieren" mit Zettel und Stift. Das kann ich selbst heute, ohne IDE kaum...
Fragen zu schon damals veralteter Hardware, usw.
Das Spektrum der Informatik ist dermaßen groß, dass kein Azubi überall Grundkenntnisse erlangen kann. Abgesehen davon, dass die Ausbildungsinhalte der Firma sich dermaßen unterscheiden, dass es zum Teil keine Schnittmenge mit der Schule gibt.
Aber so ist das halt, da muss man durch 🙂

07.03.2018 - 11:44 Uhr

Ergänzend zu dem Vorschlag von trib fällt mir dann doch noch ein, dass die Anzahl der Nachrichten (in der aktuellen Gruppe und außerhalb) ein Indiz sein könnte.

Dort ist leider häufig das Problem, dass einige Gruppen nicht öffentlich einsehbar sind. Sonst wäre es natürlich ein leichtes!
In der zu administrierenden Gruppe wird meist auch nur ein Eintrag erstellt, mit hilfreichen Produktinformationen und fantastischen Rabatten, namhafter Sonnenbrillenhersteller 😉

Es gab ein interessantes Video vom CCC zu Bots auf Twitter. Dort kann man prinzipiell alles einsehen. Dennoch ist eine zweifelsfreie Identifizierung schwierig. Der dortige Ansatz war sich Follower zu kaufen und diese zu analysieren. Denn nur so konnte man sich sicher sein, dass es sich überhaupt um Bots handele. Daraus konnte man dann Schlüsse ziehen und auf andere Bot-Netzwerke schließen. Doch auch das nicht verlässlich.
Es waren einige Accounts zu finden, die >200 Nachrichten pro Tag, oder 2-3 pro Minute verbreitet haben, es sich aber tatsächlich (nachweislich) um Menschen gehandelt hat.

Ein grundsätzlich äußerst interessantes Thema, aber nicht einfach zu lösen/erkennen.

05.03.2018 - 11:53 Uhr

Hallo Palin,

grundsätzlich wirst Du an dem Post nichts unmittelbar erkennen können.
Die sind ja schlau genug, die Inhalte auf dem Bild darzustellen und den Text laufend zu verändern.
Erkennbarer wird es aber meist an dem Benutzerprofil. Wann hat der sich bei FB registriert. Ist sein Job "arbeitet bei Facebook" was offenbar eine gewisse Glaubwürdigkeit suggerieren soll.
Hat er mehr Gruppen als Freunde.
Meist ändern die 3-4 mal ihr Profilbild, damit das Profil nicht so leer ist. Es ist dann aber immer das selbe Foto.

Das hat mir bisher "unmaschinell" geholfen, solche Bots gar nicht erst in die Gruppen zu lassen. Das aber automatisiert zu prüfen halte ich für schwierig.

20.02.2018 - 11:41 Uhr

Autodiscover funktioniert nur, wenn es auch von der IT aktiviert und "redirected" wird. Machbar, aber eben in der Hand der IT.

Man kann aber problemlos die URL manuell in das Property ExchangeServiceUrl übergeben!*Bei der IT erfragen *In OWA nachschauen *Auf gut Glück versuchen: https://outlook.office365.com/EWS/Exchange.asmx

15.02.2018 - 11:09 Uhr

Bei Lesen bereits ein FormatDescription aufrufen => Lesen wird extrem langsam

Nach Laden über Multithreaded Meschanismus FormatDescription für alle Einträge aufrufen => Extrem langsam, Einträge werden auch trotz Multithreaded Meschanismus seriell gelesen (FormatDescription blockiert intern, Instanzübergreifend)

Dann ist das Bottleneck doch wohl lokalisiert.
Das EventLog ist Multilanguage-fähig, was sicherlich einige Resourcen erfordert um den Text darzustellen.

Bisher habe ich mir immer nur per EventLogReader die gefilterten Einträge geholt und erst bei der Anzeige den Eintrag.ToXml() in was einigermaßen lesbares umgewandelt.
Das geht schnell, ist aber ausschließlich englisch und nicht so sonderlich schön. Popel mir dann per Regex die wichtigsten Stellen aus dem XML und fertig.

Für meinen Anwendungsfall reicht es zumindest aus und ist performant. Egal wie viele Einträge im Log liegen. (Filter aber i.d.R. nur auf mein Programm und die letzten 30 Tage)

10.01.2018 - 10:01 Uhr

Hallo zusammen,

vielen dank für Eure Antworten!

Habe einfach einen groben Denkfehler gehabt und die Stelle, mit der Wertigkeit der Zahl verwechselt. Bzw. schlicht und ergreifend nicht genau genug darüber nachgedacht.
Dann noch etwas Zeitdruck und das Chaos war komplett 😉

Es funktioniert nun wie es soll! Meine Methode prüft nun, ob ein bestimmter Eingang geschaltet ist oder nicht. Unabhängig, ob noch weitere Eingänge aktiv sind.
Bzw. kann man ein Event auf bestimmte Eingänge beschränken und nur auslösen, wenn ein Eingang einen bestimmten Wert hat:

private Dictionary<int, bool> _eventListenerDict;
private void reader_TagReadEvent(string tagValue)
        {
            if (_eventListenerDict.Any(entry => Helper.CheckRelaisState(tagValue, entry.Key) != entry.Value))
                return;
            if (TagReadEvent != null)
                if (_myControl.InvokeRequired)
                    _myControl.Invoke(new TagReadEventDelegate(TagReadEvent), tagValue);
                else
                    TagReadEvent(tagValue);
        }

Ihr habt natürlich Recht, ich hätte da selbst darauf kommen (können) müssen!

09.01.2018 - 09:38 Uhr

Hallo zusammen,

ich bin gerade etwas verwundert, dass eine Programmierung von mir fehlschlägt.
Es geht darum, dass ein Relais mir meldet, welche Eingänge gerade belegt sind.
Dies wird Hexadezimal gemacht. Z.B. mit 00 02
Das entspricht binär 0000 0000 0000 0010
Von rechts begonnen zu zählen und mit 0 gestartet, ist der Eingang 1 geschaltet.

Also habe ich folgende Funktion erstellt, die mir prüfen soll, ob ein spezieller Eingang nun An- oder Ausgeschaltet ist:

            var data = " ;0002";
            int number = 1;

            //Remove NewLine & Whitespace
            data = Regex.Replace(data, @"\s+", string.Empty);
           
             //port 0 is 1, 1 = 2, ect.
             number += 1;
             var hex = data.Replace(";", string.Empty);
             var i = Int32.Parse(hex, System.Globalization.NumberStyles.HexNumber);

             return (i & number) == number;

Liefert auch erfolgreich true zurück.

Nun übergebe ich Hex 0005 und das entspricht 0000 0000 0000 0101
Also 1 und 3 sind angeschaltet. Meine Funktion gibt aber, bei 1, 4 & 5 true zurück.

Habe ich einen Denkfehler? Befürchte ich verzettel mich mit dem number += 1 aber das geht nicht anders, da ich binär ja nicht den Anschluss "0" darstellen kann, sondern bei 1 zu zählen beginnen muss.

29.11.2017 - 12:37 Uhr

Was wäre denn mit System.ComponentModel.Design?

Damit kann man, zumindest unter Windows Forms die Controls verschieben und die Eigenschaften ändern.
https://msdn.microsoft.com/de-de/library/system.componentmodel.design.idesignerhost(v=vs.110).aspx

Alternativ gibt es ein paar Lösungen auf CodeProject, die so ähnlich funktionieren aber mehr Individualisierung zulassen.

Bin für ein Tool dann aber doch bei einer simplen Liste (DataGrid) gelandet, wo ich Control-Typ, Farbe, Größe und X/Y Position manuell hinterlegen kann. Ist nicht sonderlich Anwenderfreundlich, steht aber im Verhältnis zur Nutzung.
Passiert nämlich i.d.R. exakt einmal und dann nie wieder 😉

20.11.2017 - 11:11 Uhr

Hallo capk,

das ist leider nicht möglich und kann nur äußerst unschön über den DatenLayer gelöst werden. Also einem Datenset, welches die Übersetzungen der Captions passend zur Sprache beinhaltet.
Hat aber den Nachteil, dass während der Design-Time dort die Feldnamen, nicht aber die Werte stehen. Bei vernünftiger Benennung aber machbar.

Noch eine weniger elegante Möglichkeit, ist die Nutzung von Code im Report. Entweder auf Feldebene oder ein Custom VB Code, die mehr oder weniger nur ein switch-case beinhalten und die entsprechende Übersetzung zurückgeben.
Nun sieht man im Designer aber überhaupt nicht mehr welche Spalte was tut.

Daher tendiere ich zu ersterem. Oder man baut sich ein Tool, welches den RDLC dupliziert und übersetzt. Gibt es eine Änderung an dem "Master" Report, führt man das Tool erneut aus und ergänzt ggf. die fehlenden Übersetzungen.

26.10.2017 - 13:18 Uhr

Die WhatsApp API ist nicht öffentlich.

Nicht mehr!
Bevor WhatsApp die Nachrichten verschlüsselt hat, war die API noch public und man konnte/durfte sie ohne weiteres verwenden.
Deshalb geistern noch einige CodeSnippets durch das Internet und suggerieren den Leuten die Möglichkeit eine API nutzen zu können.

Btw. ist dank der Verschlüsselung auch keine andere Kommunikation als mit dem Handy möglich. WhatsApp-Web z.B. verbindet sich nur mit dem Smartphone und nicht mit den WA-Servern. Denn nur das Handy kennt die Schlüssel und kann die Nachrichten decrypten.

Da WhatsApp ja gerade dabei ist eine kostenpflichtige Unternehmensversion zu veröffentlichen, wird es da sicherlich wieder public API´s geben. Die Funktioniert dann sicherlich auch ohne Telefon.

13.10.2017 - 16:53 Uhr

Danke @p!ille!
Zumindest klappt VS mit STRG + M + L schon mal alles inkl. #region zusammen.
Leider aber auch alles bis zu dem Namespace inkl. aller Klassen.

Dafür gibt es STRG + M , O
Das tut genau was Du suchst. "L" habe ich mir vollständig abgewöhnt.

Sehe gerade, das hat Console32 ja bereits im Screenshot gezeigt. Ruhm und Anerkennung gebühren also ihm 😁

06.10.2017 - 10:05 Uhr

Hallo zusammen,

ein ähnliches Problem ist mir auch bekannt. Und zwar verwendet ein Kunde PC´s mit Akkubetrieb.
Wird der PC heruntergefahren, ist die letzte Aktion der Software, den "Schalter" umzulegen. Also den Strom zu trennen.
Das hat zu selbigem Verhalten geführt. Die Applikation bekommt vom OS die Aufforderung sich zu beenden, aber nicht mehr die Zeit die Konfig bis zum Ende zu schreiben.
Dort hatte ich regelmäßig das Problem.

Lösung war, dass ich meinen Serializer um ein "Modified"-Property ergänzt habe, welches sich bei jedem INotifyPropertyChanged.Notify() auf true und jedem Save() auf false gesetzt hat.
Somit wurden die Settings nur noch gespeichert, wenn sie mussten und nicht mehr bei jedem Programm-Ende.

Dabei noch eine zweite Datei parallel zu erstellen und im Falle eines Fehlers beim Deserialisieren zu laden, finde ich eigentlich auch recht charmant.

24.07.2017 - 09:20 Uhr

Sobald ich aber den Ordner 1:1 auf ein Netzlaufwerk schiebe und dort versuche die Schnittstelle aufzurufen bekomme ich den Fehler dass die wrapper DLL oder ein abhängige Komponente nicht gefunden wird.

Hi,
genau da liegt der Hund begraben. Das Betriebssystem schiebt gerne DLL´s einen Riegel vor, die nicht direkt auf dem PC liegen.
Zu Recht, könnte ja sonst Jeder auf das Netzlaufwerk zugreifen und die DLL durch eine schadhafte austauschen.

23.06.2017 - 13:51 Uhr

Die API hat nur bis zu dem Zeitpunkt funktioniert, bis die Verschlüsselung eingeführt wurde.
Da diese Ende zu Ende funktioniert, ist es auch gar nicht mehr möglich.
Web-Whatsapp oder die Windows-Anwendung kommunizieren direkt mit der App auf dem Handy. Nicht mit dem Server!

09.06.2017 - 17:13 Uhr

Es gibt eine spezielle Berechtigung um proxyAdresses zu ändern.
Erstellen und Löschen ist kein Problem, nur die Modifikation erfordert ein bestimmtes Recht:

MSDN: How to Use ADSI Edit to Apply Permissions

11.04.2017 - 09:46 Uhr

Guten Morgen zusammen,

ich habe eine Synchronisation gebaut, die Kontakte im AD ablegt, so dass diese in Outlook bereitstehen.
Ist der Kontakt bereits synchronisiert, müssen Änderungen natürlich nachgepflegt werden. Das funktioniert auch soweit, es sei denn: Die Mail-Adresse ändert sich.
Diese bleibt einfach wie sie ist...
Ist das eine AD-Spezifische Geschichte ala unveränderbarer UniqueID?
Muss ich den Eintrag löschen und neu anlegen?

Der Code ist recht simpel:

DirectoryEntry.Properties["mail"].Value = CleanupSpaces(eMail);
var proxyAdresses = "SMTP:" + CleanupSpaces(eMail) + ";smtp:" + custNo + "@xxx.de";
var seperator = ';';
DirectoryEntry.Properties["proxyAddresses"].Value = proxyAdresses.Split(seperator);
DirectoryEntry.Properties["telephoneNumber"].Value = phoneNo;
DirectoryEntry.CommitChanges();

Die Telefonnummer ändert sich, die Mail bleibt wie sie ist.
In einen Try-Catch läuft der Code nicht rein. Kann das aber auch leider schlecht debuggen, da der Code in einer Datenbank-Anwendung ausgeführt wird.

Hat jemand damit bereits Erfahrungen gemacht?