Ich würde gerne meinen Code etwas aufräumen und sortierter halten.
Ich dachte ich mache einfach eine eigene *.cs-Datei in das Projekt, aber so einfach scheint das nicht zu laufen. Jedenfalls wird in der neuen *.cs-Datei nichts erkannt was in der Form1.cs steht. Wie integriere ich die *.cs-Datei ordentlich in mein Projekt oder wonach muss ich suchen?
Also so 100%ig habe ich das mit den vielen Fragezeichen nicht verstanden. Vor allem das readonly string?.
Wenn man die Zeile so ließt sieht es so aus als ob der Entwickler selbst nicht sicher ist, ob die Zeile sinnvoll ist und das macht was man erwartet 😄.
Den Rest habe ich dann so Verstanden:
GetExecutingAssembly()? -> Ist was_auch_immer vorhanden?
GetName()? -> Ist ein Name vorhanden? (Welcher Name? Von der Anwendung? Warum sollte kein Name vorhanden sein, bzw. geht doch gar nicht ohne?)
Version? -> Ist ein Wert zur Versionierung gesetzt?
Ich habe mal versucht die beiden Felder Assemblyversion und Dateiversion leer zu lassen. Das funktioniert tatsächlich und in der Projektdatei steht auch kein Wert mehr drin. Komischerweise wird mir trotzdem die Version beim Ausführen angezeigt und zwar die, die ich zuletzt drin hatte, also 2.0.0.0. Die GUI hat sich den Wert trotzdem gemerkt. Wo sie den allerdings hernimmt ist mir noch unklar.
Danke Abt. Das habe ich dann falsch verstanden. Ich dachte Paket-Version ist nur bei Veröffentlichungen beispielsweise als Nu-Get Paket von Bedeutung und hat mit der Product-Version nichts zu tun. Steht ja eigentlich auch direkt am Anfang des Abschnitts. Jetzt, wo ich den Eintrag manuell gesetzt habe sehe ich auch, dass es da übernommen wurde.
Lehrt man nicht immer und immer wieder, dass in der Programmierung Befehle eindeutig und unmissverständlich sein müssen, weil sonnst ein Ergebnis entstehen kann, das man nicht erwartet? Tolles Beispiel dafür, wenn man von ProductVersion spricht, aber die PackageVersion meint 😉 Ich meine das nicht ironisch. Ist ein sehr praxisnahes Beispiel.
Danke euch. Schon bissel umständlich, dass man die Versionsnummer so einfügen muss. Hätte man ruhig ein Feld in der GUI der Projekteigenschaften machen können, wo man auch Assembly- und Dateiversion eintragen kann. Habs jetzt über "Projektdatei bearbeiten" selbst eingefügt wie von Abt gezeigt. (Danke)
Aber aus Interesse heraus und weil es vermutlich bei anderen Gelegenheiten wieder auftreten wird. Wie behandelt man die Warnung den korrekterweise? Muss man wirklich umständlich eine Abfrage schreiben von wegen
if(Assembly-Version-Feld != leer) {
lese aus
} else {
feld ist leer, gibt nix auszulesen
}
Das würde ja den schönen Einzeiler kaputt machen 🙁
Außerdem finde ich es nicht 100% sauber, wenn ich einerseits die Product-Version auslese und anzeige, AutoUpdater.NET aber die Assembly-Version heranzieht. Beide Versionen können sich ja unterscheiden und dementsprechend die Fehlersuche erschweren. Was meint ihr?
Ich habe angefangen mein Projekt auf Basis von .net 6 neu zu entwickeln.
Ich bekomme bei folgender Zeile die Warnung:
Dereferenzierung eines möglichen Nullverweises
readonly string softwareSysteminventoryVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString();
Ich habe mir den Artikel der das Thema behandelt durchgelesen, aber das Problem habe ich nicht verstanden.
Wenn ich stattdessen
readonly string softwareSysteminventoryVersion = Application.ProductVersion;
verwende ist alles OK. Wo ist den da jetzt der Unterschied? Beide male will ich eine Version auslesen.
Ich hätte mit der Verwendung von Application.ProductVersion auch kein Problem, aber in den Einstellungen von Visual Studio 2022 kann ich die Version nicht ändern. Lediglich Assembly und Dateiversion kann man anpassen. Dort habe ich jeweils auch 2.0.0.0 eingetragen. Application.ProductVersion gibt mir aber Version 1.0.0 zurück. Die Erweiterung AutoUpdater.NET die ich sehr schätze erwartet außerdem ein vierstelliges Format (X.X.X.X). Gibt also dahingehend Probleme.
Ich habe das neue Visual Studio 2022 in Version 17.0.2
Mein Projekt ist ein .Net 6.0 mit Zielsystem 10.0.19041.0
Die GUI ist fertig, aber mir fiel auf auf, dass wenn ich das Programm in Visual Studio 17.0.1 ausführte die Änderungen erst nach dem zweiten oder dritten mal übernommen wurden und das ausführbare Programm das Aussehen hatte, wie ich es im Designer festgelegt habe.
Jetzt mit Version 17.0.2 scheint das behoben zu sein, aber dafür "hängt" der Designer gerne mal, wenn man beispielsweise eine Group-Box in der Größe ändern will oder mehrere Labels mittels Auswahlrahmen auswählen will. Das nervt total.
Das war unter Visual Studio 2019 mit .net Framework 4.8 alles nicht der Fall. Ist das bekannt? Habt ihr diese Probleme auch?
Danke euch allen. Damit sollte mir weiter geholfen sein 🙂
Es ist nur eine Kleinigkeit, aber es nervt mich mittlerweile doch.
Während mir tagsüber für YouTube und co die normalen Boxen genügen, höre ich abends gerne Musik mit meinem hochwertigeren Headset. Außerdem kann man da dann etwas lauter stellen ohne das die Nachbarn gestört werden.
Ich habe mir ja schon "Sound" aus der Systemsteuerung auf das Desktop gepackt, aber auch das ist mit mittlerweile zu aufwendig, weil es ja eigentlich auch schneller geht.
Ich würde mir gerne ein kleines Tool schreiben, dass ich einfach nur Doppelklicken muss und die Audiowiedergabe springt von der Realtek Onboard-Soundkarte auf mein Logitech-Headset, bzw. wieder umgekehrt. Wonach suche ich in C#, bzw. wie kann ich das anstellen? Geht doch sicher mit einer Hand voll Zeilen, oder?
Habe Visual Studio 2022 installiert.
OK, Danke für die superschnellen Antworten. Da ich ausschließlich privat, bzw. für einen nicht kommerziellen Betrieb programmiere (deswegen können wir Lizenzen über Stifter-Helfen beziehen) brauche ich das nicht?
Ich habe momentan noch die Möglichkeit Visual Studio 2022 zu extrem vergünstigten Konditionen zu bekommen, aber um ehrlich zu sein kann ich keine Unterschiede zur Community-Edition feststellen. Kann da wer nachhelfen? Welchen Grund sollte ich haben die Pro zu kaufen?
Ich hatte keine Antwort bekommen und es war in einem anderen Forum zu einer anderen Sprache. Crossposting kann laut Abt unangenehme Folgen haben und ich bin auch niemand der sich nachsagen sagen will mehrere Communitys gleichzeitig zu beschäftigen oder zu ungeduldig zu sein. Nerven will ich auch nicht.
c# Datum umwandeln?
(Der Moderationshinweis)
Wir hatten das Thema schon, deswegen frage ich hier auch nach. Ich habe in einem anderen Forum vor über eine Woche eine Frage gestellt, aber keine Antwort bekommen. Ich rechne auch nicht mehr damit. Das Problem konnte ich aber auch noch nicht lösen.
Ab wann ist es laut allgemeiner Netiquette legitim die Frage auch anderswo zu stellen ohne das es als Crossposting gewertet wird?
Danke Jompikumpi. Der Veröffentlichungsassistent sortiert diese Dateien bereits aus. Das ist gut. Ich habe auch rausgefunden, wie man den vernünftig nutzt und die .deploy-Endungen weglassen kann. Das erzeugt bereits ein richtig gutes Ergebnis. Noch störe ich mich an zwei Dingen:
Zugegeben: Das sind alles Luxusprobleme. Man kann das alles von Hand machen. Automatisch wäre halt schöner.
@Abt: Ja, habe ich gelesen. Hätte aber sein können, dass es unter .Framework 4.x einfach anders heißt und / oder anders geregelt ist, ggf. externe Erweiterungen gibt. Deswegen hatte ich nochmal gefragt.
Ich habe jetzt auch schon mehrfach gemerkt, dass .Net 5.0 einiges anders macht und verbessert. Mit Abschluss dieser Version und dem erscheinen von VS 2022 und .Net 6 (=LTS-Version) wird umgestiegen.
Danke Abt.
Ich denke das Thema "Application publishing - .NET" und "Trim self-contained applications - .NET" ist das was ich brauche.
Das bezieht sich aber alles auf .Net Core, bzw. .Net 5, bzw. letzteres ist sogar nur dafür verfügbar, bei erstem ist es wohl das was ich suche?
// https://docs.microsoft.com/de-de/dotnet/core/deploying/trim-self-contained
Hinweis
Beim Kürzen handelt es sich um experimentelles Feature in .NET 3.1 und .NET 5.0. Kürzen ist nur für Anwendungen verfügbar, die eigenständig veröffentlicht werden.
Mein Projekt ist noch .Net 4.8. Suche ich nach was anderem?
Wenn man seine Anwendung mit VS startet gibt es im Release-Ordner bei mir folgendes Ergebnis. (Siehe Bild). Alles landet in einem Ordner ohne Unterordner. Soweit ja auch OK. Während der Entwicklung habe ich da gar nicht weiter drüber nachgedacht.
Jetzt will ich die Anwendung installieren.
Mit Inno-Setup gehe ich den Assistenten durch und wähle dann den Ordner aus. Inno Setup packt dann alle Dateien zusammen. Nach der Installation sieht der Installationsordner dann genauso aus, wie der Release-Ordner + halt die unins000.dat und unins000.
Bei keiner Anwendung habe ich bislang eine solche Struktur mit solchen Dateien gesehen. Normal gibt es Unterordner, wo das alles etwas aufgeräumt ist.
Ich habe mal die .pdb und .xml-Dateien entfernt. Damit sieht das schon eher aus, wie bei anderen Anwendungen. Meine Anwendung scheint auch zu funktionieren, so dass die entfernten Dateien scheinbar unnötig sind. (Ist dem so, wozu werden sie dann überhaupt erstellt?)
Jetzt würde ich die .dll-Dateien in einen eigenen Ordner packen wollen. Das macht die Anwendung aber nicht mit (Logisch)
Jetzt meine Fragen:
Ich habe das ganze mal auf der Projektseite eingetragen. Sollen ja am ende alle was von haben.
So, erstmal ein rießen fettes Danke an Th69.
var currentDirectory = new DirectoryInfo(Application.StartupPath);
funktioniert.
Ich möchte aber zu meiner Verteidigung sagen, dass ich der Dokumentation gefolgt bin, weil so wie ich es geschrieben hatte steht es auch da.
Trotz alle dem bin ich jetzt irritiert, ob ich die Libray richtig einsetze? Ich bin der Beschreibung auf Startseite des Projekts gefolgt. Abt verweist hingegen auf dieses Script. Ich habe dieses Script übrigens als Teil von AutoUpdater.NET gesehen und nicht als Beispielcode zur Anwendung.
Übrigens: Bei nuget ist es tatsächlich als Autoupdater.NET.Official gelistet. Bei GitHub hingegen als AutoUpdater.NET und beim using wird AutoUpdaterDotNET; angegeben. Daher habe ich es halt so hier geschrieben.
Zudem wäre es schon interessant, was beim Autostart über die Registry anders läuft (und Environment.CurrentDirectory dann quer schießt), als beim manuellen Aufruf, bzw. beim Aufruf über die Verknüpfung im Autostart-Ordner.
Stop Abt. Mit dieser Datei habe ich rein gar nichts zu tun.
Ich habe AutoUpdater.NET über nuget installiert und habe es exakt so verwendet, wie oben geschrieben. Klar halt noch das
using AutoUpdaterDotNET;
und dann halt die Pfadangabe
const string updatePath = "https://example.com/update/systeminventory/AutoUpdaterTest.xml";
// Auf Update kontrollieren.
// AutoUpdater.NET über NuGet installieren.
try
{
AutoUpdater.Start(updatePath);
AutoUpdater.ShowSkipButton = false;
AutoUpdater.ShowRemindLaterButton = false;
AutoUpdater.Mandatory = true;
//AutoUpdater.UpdateMode = Mode.Forced;
AutoUpdater.RunUpdateAsAdmin = false;
var currentDirectory = new DirectoryInfo(Environment.CurrentDirectory);
if (currentDirectory.Parent != null)
{
AutoUpdater.InstallationPath = currentDirectory.FullName;
}
}
catch (Exception)
{
MessageBox.Show("Problem im Abschnitt Update");
}
Was habe ich da jetzt falsch gemacht? Die Doku habe ich gelesen, ist ja auch sehr einfach gehalten.
Edit: Ich verwende auch die neuste Version von AutoUpdater.NET (Stand heute 1.7.0)
Danke, dass du den Link noch dazu gepostet hattest. Ich bezog das WorkingDir auf VS und nicht auf Inno Setup und hatte schon wieder Angst ich kenne wiedermal eine Grundlage nicht und bekomme dafür Kritik.
Also das mit der Verknüpfung funktioniert sowohl mit {userstartup} als auch {commonstartup}.
Ich habe aber gelesen, dass diese Methode veraltet ist und man heutzutage die Registry nutzen sollte. Was meint ihr dazu? Workaround oder Lösung?
[Icons]
Name: "{commonstartup}{#MyAppName}"; Filename: "{app}\Systeminventory.exe"; WorkingDir: "{app}"
@Abt: Wie meinst du das? Was habe ich überlesen?
Auch das feste Angeben eines Downloadpfad funktioniert nicht. Immerhin wurde jetzt aber was heruntergeladen und ich habe eine *.log-Datei, die ich hier mal einstelle:
Anwendung startet automatisch:
Donnerstag, 19. August 2021 09:59:41
ZipExtractor started with following command line arguments.
[0] C:\Systeminventory\ZipExtractor.exe
[1] C:\Systeminventory\update.zip
[2] C:\Windows\SysWOW64
[3] C:\Systeminventory\Systeminventory\Systeminventory.exeWaiting for application process to exit...
BackgroundWorker started successfully.
Found total of 20 files and folders inside the zip file.System.UnauthorizedAccessException: Der Zugriff auf den Pfad "C:\Windows\SysWOW64\AutoUpdater.NET.dll" wurde verweigert.
bei ZipExtractor.FormMain.<>c__DisplayClass4_1.<FormMain_Shown>b__2(Object _, RunWorkerCompletedEventArgs eventArgs)
Wenn ich die Anwendung manuell starte:
Donnerstag, 19. August 2021 10:00:59
ZipExtractor started with following command line arguments.
[0] C:\Systeminventory\ZipExtractor.exe
[1] C:\Systeminventory\update.zip
[2] C:\Systeminventory\Systeminventory
[3] C:\Systeminventory\Systeminventory\Systeminventory.exeBackgroundWorker started successfully.
Found total of 20 files and folders inside the zip file.
Extracting AutoUpdater.NET.dll [5%]
Extracting AutoUpdater.NET.pdb [10%]
Extracting AutoUpdater.NET.xml [15%]
Extracting Flurl.dll [20%]
Extracting Flurl.Http.dll [25%]
Extracting Flurl.Http.pdb [30%]
Extracting Flurl.pdb [35%]
Extracting Flurl.xml [40%]
Extracting Interop.WUApiLib.dll [45%]
Extracting Microsoft.WindowsAPICodePack.dll [50%]
Extracting Microsoft.WindowsAPICodePack.Shell.dll [55%]
Extracting Microsoft.WindowsAPICodePack.Shell.xml [60%]
Extracting Microsoft.WindowsAPICodePack.xml [65%]
Extracting Newtonsoft.Json.dll [70%]
Extracting Newtonsoft.Json.xml [75%]
Extracting System.ValueTuple.dll [80%]
Extracting System.ValueTuple.xml [85%]
Extracting Systeminventory.exe [90%]
Extracting Systeminventory.exe.config [95%]
Extracting Systeminventory.pdb [100%]
Successfully launched the updated application.
Ich frage mich mittlerweile, ob ich nicht auf einen Bug gestoßen bin und ich es auf der Projektseite bei GitHub melden sollte? Was meint ihr? Interessant wäre halt zunähst raus zu bekommen, was beim Start der Anwendung über den Autostart anders läuft, als beim manuellen Start.
@dannoe: Wie kann ich das mit dem Debuggen und Anhängen eines Prozesses machen Die Anwendung läuft doch unabhängig von VS.
Edit: Der Vollständigkeit wegen hier noch das Installscript. Ich habe den Registry-Eintrag der Dokumentation entsprechend mal abgeändert.
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "Systeminventory"
#define MyAppVersion "1"
#define MyAppPublisher "*****"
#define MyAppURL "https://www.*****"
#define MyAppExeName "Systeminventory.exe"
[Setup]
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{*****}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=C:\Systeminventory\{#MyAppName}
DisableDirPage=yes
DisableProgramGroupPage=yes
; Uncomment the following line to run in non administrative install mode (install for current user only.)
;PrivilegesRequired=lowest
OutputBaseFilename=Systeminventory-Setup
SetupIconFile=C:\Users\*****\source\repos\setup.ico
Compression=lzma
SolidCompression=yes
WizardStyle=modern
[Languages]
Name: "german"; MessagesFile: "compiler:Languages\German.isl"
[Files]
Source: "C:\Users\*****\source\repos\Systeminventory\Systeminventory\bin\Release\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\*****\source\repos\Systeminventory\Systeminventory\bin\Release\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Registry]
Root: HKA; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "Systeminventory"; ValueData: """{app}\Systeminventory.exe"""; Flags: uninsdeletevalue
Danke dannoe. Klappt aber leider auch nicht. Mit
AutoUpdater.DownloadPath = Environment.CurrentDirectory;
(wie im Link vorgeschlagen) gibt es folgenden Fehler, aber auch nur wenn das Programm beim Login gestartet wird. Manuell gestartet läuft alles durch.
System.Net.WebException
Ausnahmefehler während einer WebClient-Anforderung.
OK
Ich habe mal mit O&O RegEditor (x64) geguckt, wo der Installer den Autostarteintrag macht. Sieht wie folgt aus. Könnt ihr da was mit anfangen?
Schlüssel: HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
Daten: "C:\Systeminventory\Systeminventory\Systeminventory.exe" /login
Habs auch ohne den Schalter "/login" probiert.
Jetzt wo du es sagst... in dem Ordner schreibe ich nichts rein und es liegt dort auch gar keine AutoUpdater.NET.dll.
Wie kommt die Anwendung nur darauf das die dort liegen soll? Die AutoUpdater.NET.dll liegt dort, wo sie hingehört, nämlich im Verzeichnis der Anwendung zu der sie gehört (In dem Fall C:\Systeminventory\Systeminventory)
Edit: So setze ich AutoUpdater.NET ein:
// Auf Update kontrollieren.
// AutoUpdater.NET über NuGet installieren.
try
{
AutoUpdater.Start(updatePath);
AutoUpdater.ShowSkipButton = false;
AutoUpdater.ShowRemindLaterButton = false;
AutoUpdater.Mandatory = true;
//AutoUpdater.UpdateMode = Mode.Forced;
AutoUpdater.RunUpdateAsAdmin = false;
var currentDirectory = new DirectoryInfo(Environment.CurrentDirectory);
if (currentDirectory.Parent != null)
{
AutoUpdater.InstallationPath = currentDirectory.FullName;
}
}
catch (Exception)
{
MessageBox.Show("Problem im Abschnitt Update");
}
Hallo ihr lieben,
Ich habe mir mit Inno-Setup einen Installer für mein Programm gebaut und lasse es in den Autostart eintragen. Programm startet auch und tut was es soll.
Inno-Setup
[Registry]
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; \
ValueType: string; ValueName: "Systeminventory"; \
ValueData: """{app}\Systeminventory.exe"" /login"
Probleme gibt, es wenn eine neue Version zur Verfügung steht. Das erledige ich mit AutoUpdater.NET.
Wenn das Programm nach dem Einloggen dann startet und mir automatisch anzeigt, dass es ein Update gibt und ich updaten will, dann gibt es folgenden Fehler. Das Update wird auch nicht durchgeführt.
System.UnauthorizedAccessException
Der Zugriff auf den Pfad "C:\Windows\SysWOW64\AutoUpdater.NET.dll" wurde verweigert.
OK
Starte ich das Programm ganz normal funktioniert das Update. Momentan arbeite ich mit Administratorrechten. An mangelnden Benutzerrechten kann es also nicht liegen, zumal das Programm ohnehin an einem Ort installiert ist, wo der Anwender Schreibzugriff hat und AutoUpdater.RunUpdateAsAdmin = false; gesetzt ist.
Ich habe keine Idee was ich machen kann oder warum das Problem auftritt. Debuggen geht ja auch nicht. Könnt ihr bitte helfen?
Nennen wir es "Benutzerprivileg". Zumindest könnten dann (schonmal) eingeloggte Benutzer entscheiden was sie wollen. Gäste müssen dann halt dann nehmen, was das Team schlussendlich entscheidet.
Vielleicht besteht die Möglichkeit das die Benutzer das in den Einstellungen für sich festlegen können?
Habe ich das so eigentlich richtig verstanden, damit es da keine Verwirrungen meinerseits gibt?
Eine Deklaration ist sowas wie:
string computerName;
Eine Initialisierung ist sowas:
const string emailAdress = "info@example.com"; // Variable unveränderbar
string emailAdress = "info@example.com"; // Variable änderbar
Eine Definition ist sowas wie eine Funktion, also beispielsweise das hier:
public void SendMail() {}
Was mir nicht klar ist: Wann in der Praxis verwendet man public und wann kommt private zum Einsatz und warum macht man nicht alles public? Dann gibt es noch protected, aber das scheint eine Sonderform zu sein, die ich kaum wo sehe, bzw. ich habe nur davon gehört, gesehen noch gar nie.
Bei Funktionen wird wohl immer public genommen. Beim Form_Load oder Button_Click nimmt VS automatisch private.
Bei Funktionen kenne ich nur den Zusatz "void". Gibt es noch andere? Welche und wann werden die in praktischen Fällen verwendet?
Ja, aber DateTime soll man doch nicht nehmen, bzw. ist veraltet, bzw. an der Stelle auch das Falsche.
Arghs, das wird ja immer schlimmer.😭
Auf Stackoverflow soll doch nicht diskutiert / Smaltalk gehalten werden, sondern nach Möglichkeit ausschließlich Code gepostet werden. Selbst meine Begrüßung im Erstposting wurde wegeditiert. Also anders als hier. Deswegen war das für mich kein Crossposting, sondern eine erweiterte Nachfrage zu einem existierendem Thema. Außerdem hat dort ja niemand mehr geantwortet und ich rechne auch nicht mehr damit. Dafür ist die Plattform zu groß und unübersichtlich, so dass mein Post irgendwo in den Untiefen untergegangen ist. Wundert mich eh, wie das funktioniert.
Beim Debug bekomme ich irgendwie überhaupt gar nichts.
Ich bräuchte da nochmal eure Hilfe. Ich möchte nur das letzte Installationsdatum. Bei Stackoverflow hat man mir eine Lösung präsentiert, aber wenn ich die anwenden zu versuch, knallts wieder beim Datumsformat. Habs jedenfalls nicht hinbekommen.
Toll wäre also, wenn ihr mir sagen könntet, wie ich das maxDate in meinen Code einbauen kann oder nach Datum sortieren kann, womit ich dann ja auch automatisch das oberste bekommen würde. Letzteres würde die Möglichkeit offen halten (mit Version 2.0 meines Tools) einen Updateverlauf anzuzeigen.
Zum Thema Verlinkung: Finde neuen Tab auch besser. Ist eigentlich auch Standard, wenn auf eine fremde Seite verlinkt wird, die nicht zur eigenen Domain / Forum gehört. Denke nämlich meist auch nicht hier die mittlere Maustaste zu benutzen, weil wie gesagt das gefühlt 95% der Webseiten anders handhaben.
Spamfilter anlernen und fertig. Manches läuft hier anders als in anderen Communitys 😉
Ja, hmmm. Irgendwie ist die Schrift nach dem Bearbeiten "silber" geworden. Hatte es danach bearbeitet und weggemacht, aber jetzt ist es wieder.
Edit: Grad nochmal rumprobiert: Lässt sich nicht reproduzieren...
Tja, schreibt man allgemein heißt es, man sollte nicht für die Gemeinschaft sprechen, schreibt man für sich persönlich heißt es man sei "Ich"-bezogen. In jeder Community wollens die Admins und Mods anders haben und haben auch andere Vorstellungen davon, wie man sich auszudrücken hat. Man macht es immer falsch 👎
Ich schreibe inzwischen so, wie es mir gerade liegt, weil ich der Meinung bin man sollte nicht auf die Sprache reduziert werden. Mittlerweile sollte man meinen Charakter ja auch ein bisschen kennen. Komme ich echt so "Ich"-Bezogen rüber? Eigentlich pflege ich schon den Communitygedanken, auch wenn ich oft "Ich" schreibe. Ich pflege einfache Sprache (Sieht man ja auch am Code und meinen gesuchten Lösungen) und verweigere auch im Berufsleben inzwischen das "gendern". Niemand kennt mich hier persönlich. Niemand von euch, weis ob ich ein Handicap habe, eine Behinderung, vielleicht deutsch nicht meine Muttersprache ist oder oder oder.. Also bitte hängt euch nicht daran auf, weil ein Beitrag, ein Satz oder gar ein Wort vielleicht nicht richtig gewählt sind oder ich mich nicht ganz so elegant, verschnörkelt oder gar unterwürfig ausdrücke.
Es ist schön, wenn von euch keine Gegenleistung erwartet wird. Ihr wollt ja auch keine Spenden (ja, ich hatte den Link angeklickt). Ich selbst habe diesen Anspruch an mich selbst, zumindest wenn so viel wie bei meinem Projekt nur dank Mithilfe der Community zustande kam. Deswegen möchte ich mein Projekt dann auch zumindest unter der Prämisse "Anschauungsprojekt" veröffentlichen. Aber logischerweise erst dann, wenn ich es selbst zu Version 1.0 erkläre und nicht irgendwas halbfertiges oder offensichtlich verbuggtes. (Dafür fehlen noch zwei Dinge)
Ich möchte mich auch nicht streiten, weil dafür kam hier einfach zu viel Hilfe und Entgegenkommen und hoffe auch weiter auf euch zählen zu dürfen. Ich möchte mich aber auch nicht anranzen lassen, weil ich es mir erlaubt habe ein Feature zu wünschen oder eine Mutmaßung zu äußern, die noch dazu auf der Mutmaßung eines anderen beruht. Das "Bitte bitte" war zwar bewusst doppelt (hätte ja auch ein Fehler sein können), sollte aber kein
Ich will aber! Ich will aber!
sein, sondern Ausdruck dessen, dass mir das Feature wichtig gewesen wäre. Ich räume hinter mir nunmal gerne auf. Ist das verwerflich?
Edit: Und jepp, dass mein Datenbankdesign nicht ideal ist weis ich und sehe ich auch vollkommen ein. Mit Version 2.0 wird alles besser. Ich lerne ja. 🙂
@Abt: Ich habe dein Nachtrag erst jetzt gelesen als ein neuer Beitrag kam, daher auch jetzt meine Antwort:
Ich weis jetzt ehrlich gesagt nicht, warum du mich derart angehst. Ich muss mir in solchen Fällen auch immer wieder anhören, dass meine Fehler schon im Design liegen, daher habe ich das mit Lächeln hier auch mal wieder gegeben. (Jaja, ist ein anderes Forum, aber du weist worauf ich hinaus will)
Natürlich weiß ich nicht, wie eure Datenbank im Hintergrund aufgebaut ist, aber wenn man PNs nicht löschen kann, weil "$begruendung" dann mag das vielleicht von euch so gewollt sein, schön ist es aber nicht. Das werde ich ja wohl noch sagen dürfen, oder darf ich als Noob und Hilfsbedürftiger vom Dienst keine eigene Meinung haben, bzw. die nicht äußern?
Auch, dass du mir zumindest indirekt vorwirfst ich wäre Ich-Bezogen und würde das Forum und die Community als für mich erstellt betrachten kann ich nicht nachvollziehen. Ja, ich frage momentan sehr viel, ja ich bin sehr hilfsbedürftig, ja ich habe mit der Programmierung meine Probleme und ja, vielleicht bin ich dafür auch nicht gemacht. Aber es interessiert mich, ich will es lernen und ich nehme dafür die kostenlose Hilfe dieser Community dankend an und ihr habt mich und mein Projekt enorm vorangetrieben und meine Motivation aufrecht erhalten, die zwischendrin etwas gesunken war. Um es klar zu sagen: Mein Projekt wäre ohne eure und auch deine persönliche Hilfe nicht da wo es jetzt steht und quasi fast einsatzbereit. Das verdanke ich euch und ich möchte den Quellcode am Ende, soweit das sinnvoll ist auch veröffentlichen. Ist ja schon fast ein Gemeinschaftswerk.
Ich habe gerade den Eindruck (möchte nichts unterstellen, es ist nur ein Eindruck, kann mich irren), dass du ne ganze Menge Frust gegen mich schiebst und mein Beitrag jetzt Anlass war dem freien Lauf zu lassen. Finde ich sehr schade, denn bislang war ich wirklich gerne Teil dieser Community und habe mich gut aufgehoben gefühlt und nicht von oben herab behandelt nach der Art "Lern erstmal die Basics und komm mit echten Problemen wieder". Dannoe der die Vermutung mit den PNs und nicht löschen ja zuerst aufstellte bist du jedenfalls nicht (auch) angegangen.
Soweit es in meiner Macht stand wollte ich auch was zurückgeben. So ganz ist das zwar nicht geglückt, aber könnte ja noch kommen und ich hoffe der Wille ist erkennbar.
Bitte denkt immer daran: Am Ende sitzt auch ein Mensch mit seinen Stärken, Schwächen und Gefühlen. Vielleicht wurde auch nur alles falsch aufgefasst. In dem Fall. Sorry.
Das finde ich aber doof. Ich würde meinen Postein- UND Ausgang gerne sauber halten. Wenn das nur möglich ist in dem die Nachricht bei beiden Parteien gelöscht wird dann ist das ein "Fehler im Design" wie man so schön sagt. Jede Partei sollte seine eigene Kopie der Nachricht haben, so wie das bei jeder Forensoftware die ich kenne der Fall ist.
Bitte bitte umsetzen.
[Bug] Nachrichten im Posteingang löschen funktioniert. Nachrichten aus dem Postausgang löschen funktioniert nicht. Ist das wegen meines Benutzernamens?
Fehler
Keine Nachricht mit der Id #46013 gefunden.
Hab mehrere Nachrichten die ich löschen wollte. Immer das Gleiche.
Ich habe ja hier nachgefragt, WEIL ich über Google nichts gefunden habe 🙂 Hätte ja aber sein können, dass sowas nicht oft gemacht werden will und entsprechend Informationen spärlich sind oder ich schlichtweg falsch gesucht habe.
Aber so wie ich eure Antworten deute ist es wohl so, dass man ohne die Hersteller API / Hersteller SDK nicht wirklich weiter kommt, zumindest auf meinem Level der Programmierung.
Der Dienst soll ständig im Hintergrund laufen. In meinem Fall wollte ich, dass der Onlinestatus tagsüber alle X Stunden ausgegeben wird, nach Feierabend, wenn Rechner / Server i.d.R. entweder eh an oder aus sind und sich daran nichts mehr ändert wollte ich die Zeitspanne höher setzen. (Server sind natürlich eh immer an) Immerhin wird die Datenbank bei einem Webhoster gehostet und da muss man ja nicht ständig sinnlos Verbindung aufnehmen. K.A. ob das ins Gewicht fallen würde oder nicht. Der Dienst soll am Ende auf ~80-90 Rechnern laufen und ausschließlich mitteilen ob Rechner / Server online oder offline.
Momentan schwanke ich aber, ob das Vorhaben noch sinnvoll ist. Im Grunde würde es reichen den Onlinestatus bei den Workstations / Laptops beim Hochfahren zu ermitteln (mit meinem Tool, das ich entwickle) und bei den Servern das extra zu regeln. Es gibt aber einige Rechner die im Grunde immer an sind, wie beispielsweise meiner im Büro und es dann schon wichtig wäre zu wissen, dass dieser verwendet wird und nicht nur rum steht. Wenn ich den Rechner zwei Wochen nicht neu starte hat man in der Datenbank entsprechend stehen, dass der Rechner zuletzt vor zwei Wochen gestartet wurde, also kaum benutzt wird. Das dem nicht so ist würde man daran erkennen, dass er sich immer wieder Online meldet.
Nichts desdo trotz wollte ich den Code halt mit euch teilen, weil es der ein oder andere sicher gebrauchen könnte. Das er nicht ganz perfekt war und als Snippets nicht taugte ist ein anderes Thema 🙁
Jetzt bin ich vollends irritiert.
Ich wollte euch eben zeigen, dass der Code funktionierte (in dem Sinn, dass er beide Bildschirme ausgab) als ich die Konvertierung noch falsch gemacht habe und habe es entsprechend rückgängig gemacht.
Das Ergebnis ist dann als Textbox:
// Wieso das doppelt ist verstehe ich nicht.
MSI MAG241 | ORIONMSI MAG241 | ORION
Als Label:
// Das Ausgabeformat war erstmal ganz OK, wenngleich noch nicht brauchbar.
MSI MAG241 | ORION
Naja, ist ja eh falsch gewesen, also den richtigen Code genommen, also das mit
monitorModel += Encoding.ASCII.GetString(ufnASCIIBytes);
Je nachdem wie ich mir das ausgeben lasse erhalte ich unterschiedliche Ergebnisse:
Als textBox2.Text ist es:
// Ergebnis wie erwartet und nachvollziehbar
MSI MAG241CRORION
Als label26.Text ist es:
// Ergebnis wie erwartet und nachvollziehbar. Durch das += hänge ich ja einen String an.
label26MSI MAG241CRORION
Als monitorModel, das weiter unten dann dem Label zugewiesen wird, also "lblMonitorModel.Text = monitorModel;" ist es dann
// Ergebnis nicht verständlich. Wieso wird der zweite Monitor jetzt unterschlagen?
MSI MAG241CR
Nimmt man das += raus und macht ein einfach = gibt es nichts aus.
Wisst ihr nun weiter? Von der Sache her werden doch eigentlich beide Bildschirme ermittelt und ausgegeben. ORION ist übrigens mein Fernseher der für diesen Test halt herhalten muss.
Edit: Achja, wenn ich mir das Trennzeichen am Ende hinmache, also
textBox2.Text += Encoding.ASCII.GetString(ufnASCIIBytes) + "|";
gibt es ein Ergebnis wie dieses: (Beispiel anhand von textBox2.Text)
M|S|I| |M|A|G|2|4|1|C|R|O|R|I|O|N|
Mir ist aber klar warum, wollte es nur der Vollständigkeit halber noch dazu schreiben, weil ich es ja im Gegensatz zu oben dann rausgenommen hatte.
Ist es irgendwie möglich mittels C# Hersteller und Modell von Druckern / Kopierern mittels IP abzufragen? Also ich will das Netzwerk scannen und mir ausgeben lassen, wie oft Hersteller und Modell vorhanden sind. Geht das überhaupt? Wie müsste man vorgehen? Einige Setup-Programme der Hersteller können das ja und listen diverse Modelle bei einer Netzwerkinstallation auf. Geht das nur mittels API der Hersteller? Da kommt man leider nicht so ohne weiteres dran, zumindest bei HP und Kyocera. Freue mich auf eure wie immer hilfreichen Antworten.
Kennt sich wer mit dem Autoupdater aus? Das Teil funktioniert, aber die Prüfung der Dateiintegrität schlägt bei mir immer fehl.
Ich frage dann nochmal zaghaft nach, ob sich wer der Thematik annehmen will. Konnte es bislang nicht lösen.
Ich habe die Tage danach gesucht, wie ich bei einem Programm / Dienst eine Aktion tagsüber anders ausführen kann, als abends. Ein direktes Beispiel konnte ich nicht finden, sondern musste es mir zusammenreihmen. Heraus kam das hier und ich möchte es mit euch teilen 🙂.
var startTime = "08:00:00";
var endTime = "18:00:00";
if (DateTime.Now > DateTime.Parse(startTime) && DateTime.Now < DateTime.Parse(endTime))
{
// Mach was zwischen 08:00 Uhr und 18:00 Uhr
}
else
{
// Mach was außerhalb der oben genannten Zeit
}
Kann natürlich sein. Bei dem einen Arbeitgeber, wo ich der Admin installiere ich die Software immer als Admin von Hand. Habe da leider auch keinen Server der das machen könnte. Der zweite Arbeitgeber, wo ich nur ein kleines Licht in der Abteilung bin hat hingegen eine gigantische IT-Infrastruktur mit SCCM und co. zur Verfügung. Denke mal, dass es da deswegen anders installiert wurde. Aber so prüfe ich jetzt einfach beide Pfade. Schadet ja auch nicht und gelernt habe ich auch gleich was.
OK, jetzt gehts. Meine Güte. Was ein Umstand nur um nen blöden String auf Linie zu bringen. Danke für eure Geduld.
systemLastWindowsUpdate = result.ToString("yyyy-MM-dd");
Also das "Problem" war, dass ich einfach mit dem String weiter arbeiten wollte. Für mich ist 6/22/2021 nunmal 6/22/2021. Für den Debugger offenbar nicht, obwohl er das sagt. Ist halt so. Verstehen tu ich das nicht 😡 (Siehe Bild)
Nun habe ich mich an das Beispiel aus der Doku gemacht. Das erste Beispiel habe ich nicht zum Laufen bekommen, trotz des richtigen Formats (M/dd/yyyy bzw. M/d/yyyy).
Das zweite Beispiel mit "with leading white space" hat dann immerhin ein Ergebnis gegeben, aber nicht, das, was ich mir erhofft habe. Umwandeln klappte natürlich damit erst recht nicht.
22.06.2021 00:00:00 +00:00
string stringDate = managementObject["InstalledOn"].ToString();
string format = "M/dd/yyyy"; // M/d/yyyy geht auch
CultureInfo provider = CultureInfo.InvariantCulture;
DateTimeOffset result = new DateTimeOffset();
result = DateTimeOffset.ParseExact(stringDate, format, provider, DateTimeStyles.AssumeUniversal);
systemLastWindowsUpdate = result.ToString();
Wenn ich mit einem Beispiel nicht klar komme suche ich nach Alternativen. In der Programmierung gibt es ja in 99% der Fälle mehrere Wege zum Ziel. Mir ist es wichtig nach zu vollziehen was ich mache. Wenn dem nicht der Fall ist frage ich, wie bei der Sache mit dem ??-Parametern.
Die Microsoft-Doku hat mir übrigens bislang eher selten weiter geholfen. Auf stackoverflow wurde ich hingegen schon öfters fündig, zumindest dann nachdem ich wusste, wonach ich eigentlich suche. Dazu kamt dann in der Regel noch ihr, wo es dann partout klemmte.
Was ich in dem Fall jetzt nicht verstehe: Ich habe einen dummen String von beispielsweise 6/22/2021 oder 6.22.2021. Warum kann ich diese Zahl direkt in den Quelltext schreiben und umformatieren, aber nicht, wenn exakt die gleiche Zahl aus einer Variablen kommt? Das kapiere ich nicht.
Ich finde es unfair immer zu behaupten ich würde die Doku nicht lesen. Das ich es vielleicht einfach nicht verstehe, darauf kommt Abt nicht 😗(. Ich suche ja auch deswegen auch in anderen Quelle, wo das ganze nochmal anders erklärt oder dargestellt wird.
Krieg es nicht geknackt 😭
Das "beste" was jetzt bei rausgekommen ist das. Alle Versuche aus "x" ein gescheites Datum zu formatieren scheiterten.
6.22.2021
Ich brauche es aber als 2021-06-22, damit es ordentlich in MySQL-Eingetragen werden kann. Die Spalte dort ist vom Tyo "date".
var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_QuickFixEngineering");
using (ManagementObjectCollection managementObjectCollection = searcher.Get())
{
ManagementObject managementObject = managementObjectCollection.OfType<ManagementObject>().First();
string stringDate = managementObject["InstalledOn"].ToString();
DateTimeOffset PassDate = DateTimeOffset.UtcNow;
var dateFormat = stringDate;
var x = PassDate.ToString(dateFormat);
systemLastWindowsUpdate = x.ToString();
}