Laden...
D
da_user myCSharp.de - Member
nähe Regensburg Dabei seit 21.08.2008 94 Beiträge
Benutzerbeschreibung

Forenbeiträge von da_user Ingesamt 94 Beiträge

10.11.2021 - 11:04 Uhr

Nachtrag:
ich hätte jetzt gerne meinen Zweiten Beitrag hier in diesem Thread editiert um darauf hinzuweisen, dass meine Problemlösung falsch war. Leider kann ich keine Beiträge editieren. Könnte das ggf. ein Mod für mich übernehmen?

10.11.2021 - 11:01 Uhr

Na, dann wird noch die eine oder andere Frage kommen, zwei kleinere hätte ich schon in der Pipeline...

Jetzt kommt erstmal eine Korrektur für mein Geschreibsel weiter oben. Wenn man in der zur Tabelle gehörenden Klasse das Feld als "DateTime" definiert, arbeitet man natürlich wieder nicht mit "DateTimeOffset". Das habe ich natürlich korrigiert und musste dann den Converter auch wieder "richtigrum" bauen. Hat dann aber beim Zugriff auf die Werte zu einem Fehler geführt:


                var Fundstellen = SakilaContext.Table1
                    .Where(t => t.colum1 == valueToSearch);
                foreach (var Fundstelle in Fundstellen) //<== hier Fehler

Fehlermeldung:
System.ArgumentException: "Der UTC-Offset des lokalen dateTime-Parameters stimmt nicht mit dem Offset-Argument überein.
Parametername: offset"

Per google gefunden auch als> Fehlermeldung:

DateTimeOffset Error: UTC offset of local dateTime does not match the offset argument datetimeoffset-error-utc-offset-of-local-datetime-does-not-match-the-offset-arg

Ich musste entsprechend den Converter nochmal umbauen. Fertig sieht das ganze dann so aus:

In der zur Tabelle passenden Klasse:

public DateTimeOffset last_time { get; set; }

Das Property gehört sich in der Datei "sakilaContext.cs" in der Methode "OnModelCreating" gesetzt:


protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Table1>(entity =>
    {
        entity.ToTable("Table1");
        //---snipp---
        entity.Property(e => e.last_time)
            .HasColumnName("last_time") //≤"last_time" anpassen
            .HasColumnType("timestamp")
            .HasConversion(GetDateTimeToDateTimeOffsetConverter());
    });

Der Converter gehört sich in der gleichen Klasse definiert. Ich musste allerdings noch die Verweise auf "ValueConverter" anpassen und den Converter zwecks DateTimeOffset anpassen:


        private Microsoft.EntityFrameworkCore.Storage.ValueConversion.ValueConverter GetDateTimeToDateTimeOffsetConverter()
        {
            var converter = new Microsoft.EntityFrameworkCore.Storage.ValueConversion.ValueConverter<DateTimeOffset, DateTime>(
                                        requestedWithOffset => requestedWithOffset.DateTime,
                                        requested =>  new DateTimeOffset(new DateTime(requested.Ticks, DateTimeKind.Unspecified), TimeZoneInfo.Local.GetUtcOffset(DateTime.Now))
                                        //requested => new DateTimeOffset(requested, TimeSpan.Zero)
                                        );

            return converter;
        }

Bei mir scheinen die Zeiten nach meinen ersten Kontrollen soweit zu passen. GGf. muss man natürlich, je nachdem dass die Zeiten in der jeweilligen Datenbank gespeichert sind, den Offset anpassen (TimeZoneInfo.Local.GetUtcOffset(DateTime.Now)).


So, damit noch zwei Fragen zu EF:

* Gibt es die Möglichkeit die Datenbank auf neu hinzugekommene Werte (die einem bestimmten Filter entsprechen) zu überwachen?
* In einer meiner Tabellen werden bei mir Werte kodiert gespeichert. Diesen Wert muss ich erst in einer anderen Tabelle "Wandlung" suchen, dass ich dann den Reintext bekomme. Diese Tabelle Wandlung ändert sich nicht, bzw. nicht ohne dass ich das mitbekomme. Wäre es jetzt besser sich zu erst diese komplette Tabelle lokal bereitzulegen um Zugriffe auf die Datenbank einzusparen? Oder wird das sowieso optimiert?

08.11.2021 - 12:59 Uhr

Hallo Abt,

ich komme leider erst am heutigen Montag wieder dazu, da dran zu arbeiten.

Die korrekte Verwendung von Zeiten ist DateTimeOffset, nicht (mehr) DateTime.

In der Datenbank wird der Wert leider als DateTime gespeichert. Daran kann ich auch nix ändern. Wie ich diesen Wert dann natürlich bei mir programmintern weiterverarbeite ist eine andere Geschichte. Und nach dem Studium deines Artikels werde ich wohl DateTime aufs Abstellgleis schieben.

Hättest auch über die entsprechenden GitHub Issues finden können:
>

Hätte ich, wenn ich gewusst hätte, wo ich suchen muss. Aber dass ich in den GitHub Issues suche, noch dazu im eigentlich "falschen" dotnet/efcore, wäre ich nicht gekommen. Bin ja auch nur "Bastelprogrammierer" 😉

Ich habe mich jetzt gerne nach dem letzten Beitrag der Issue-Meldung gerichtet (https://github.com/dotnet/efcore/issues/6601#issuecomment-554773511 ), hatte dabei aber ein paar Probleme. Vielleicht stößt ja jemand anderes per Google oder so auf diesen Thread, darum meine Lösungen:

In der zur Tabelle gehörenden Klasse muss natürlich auch das dazugehörige Feld mit dem Typ DateTime definiert werden:

 public DateTime last_time { get; set; }

Das Property gehört sich in der Datei "sakilaContext.cs" in der Methode "OnModelCreating" gesetzt:

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Table1>(entity =>
            {
                entity.ToTable("Table1");
                //---snipp---
                entity.Property(e => e.last_time)
                    .HasColumnName("last_time") //<="last_time" anpassen
                    .HasColumnType("timestamp")
                    .HasConversion(GetDateTimeToDateTimeOffsetConverter());
            });

Der Converter gehört sich in der gleichen Klasse definiert. Ich musste allerdings noch die Verweise auf "ValueConverter" anpassen und den Converter "umdrehen":


        private Microsoft.EntityFrameworkCore.Storage.ValueConversion.ValueConverter GetDateTimeToDateTimeOffsetConverter()
        {
            var converter = new Microsoft.EntityFrameworkCore.Storage.ValueConversion.ValueConverter<DateTime, DateTimeOffset>(
                                        requested => new DateTimeOffset(requested, TimeSpan.Zero),
                                        requestedWithOffset => requestedWithOffset.DateTime
                                        );

            return converter;
        }

Damit natürlich Danke an Abt, der mich hier mit dem Zaunpfahl auf die richtige Spur gebracht hat.

05.11.2021 - 11:12 Uhr

Verwendetes Datenbanksystem: <MariaDB>

Hallo,

ich versuche mich aus akuten Gründen gerade etwas in das Entity-Framework einzuarbeiten - ich muss auf eine MariaDB zugreifen. Ich halte mich da an das offizielle Tutorial unter Verwendung des Package-Managers: https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework-core-scaffold-example.html#connector-net-entityframework-core-scaffold-packagemgr

Zielframework ist .NET Core 3.1
EF-seitig sind mit NuGet installiert:
MySql.EntityFrameworkCore for Entity Framework 5.0.8+MySQL8.0.27
Microsoft.EntityFrameworkCore.Tools 5.0.11

Wenn ich aus dem letzten Schritt des Tutorials das Scaffolding starte, erhalte ich dabei Fehlermeldungen, dass das EF nicht mit dem Datentyp "timestamp" der Datenbank umgehen kann. Bsp.:> Fehlermeldung:

Could not find type mapping for column '****.last_time' with data type 'timestamp'. Skipping column.
Unable to scaffold the index 'last_time'. The following columns could not be scaffolded: last_time.

Ansonsten läuft das ganze - soweit ich das beurteilen kann - gut durch. Ich habe auch schon etwas weiter gespielt und mir zur Funktionsprüfung div. Datenbankeinträge anzeigen lassen - funktioniert alles, mir fehlt halt die Spalte "last_time" mit den Timestamps.

Ich habe dazu natürlich schon google angeschmissen und bin hierauf gestoßen, laut dem letzten Eintrag seit der Core Version 5.05 funktionieren soll: https://bugs.mysql.com/bug.php?id=102381

Was läuft den hier schief?

26.02.2019 - 19:48 Uhr

Unter Umständen eine ganz bescheuerte Antwort, aber evtl. auch passend:

MS Word/Office kann Legendengrafiken. Und m.w. sind da auch welche im "Comic-Sprechblasen-Style". Was fehlt sind Gedankenblasen.
Ist halt kein Grafikprogramm...

20.02.2019 - 18:35 Uhr

leider weiß ich nicht wie ich auf freeDriveLetters zugreifen kann.
z.B. ConsoleWriteLine(freeDriveLetter[0]; funktioniert nicht

Sobald ich das return freeDriveLetter entferne geht es

Gar nicht. Das ist eine Variable die nur in der Methode gültig ist. Der Aufruf von "GetFreeDriveLetters()" liefert dir eine String-Liste mit den freien Laufwerksbuchstaben zurück:

 ConsoleWriteLine(GetFreeDriveLetters()[0]);

Oder, u.U. besser verständlich:

List<string> FreieLaufwerksbuchstaben = GetFreeDriveLetters()

Rückgabewert einer Methode ist allerdings Grundlagenwissen.
Ums simpel zu erklären: wenn du eine 'Methode' programmierst, schreibst du "quasi" einen Befehl wie es z.B. "System.IO.DriveInfo.GetDrives()" einer ist.

13.02.2019 - 20:49 Uhr

Naja, ich bleib jetzt erstmal bei "Path.GetDirectoryName (Assembly.GetExecutingAssembly ().Location);", mal sehen...

BTW, wenn der Thread ja praktisch schon veraltet ist:
Gibt es da heutzutage bessere/andere Varianten?

13.02.2019 - 20:27 Uhr

Ja, aber auch dass die anderen Methoden ebenfalls ihre Probleme haben. So die eine "beste" Lösung lese ich da ehrlich gesagt nicht heraus.

Höchstens noch "Path.GetDirectoryName (Assembly.GetExecutingAssembly ().Location);"
Der scheint auch soweit auch zu funktionieren, aber funktioniert der immer wenn die Voraussetzung gegeben ist, dass der Befehl in der exe steckt? Kann ich mich darauf verlassen?

Application.StartupPath habe ich bis dato auch schon öfter verwendet und jetzt ist es das erste Mal, dass dieses Problem auftritt und gefühlt mache ich eigentlich auch nix anders als sonst. Und ich arbeite auch nicht an einem Dienst, sondern an einer ganz normalen Windows.Form-Anwendung.

13.02.2019 - 19:07 Uhr

Hi,
ich suche einen Weg das Verzeichnis in dem sich meine .exe befindet zu ermitteln. Ich bin ja dort schon fündig geworden mit

Application.StartupPath

Allerdings habe ich damit ein Problem: der letzte Ordner fehlt!
Die .exe befindet sich im Debug-Modus also beispielsweise in

\*Benutzer*\Documents\Visual Studio 2017\Projects\*Projektname*\*Projektname*\bin\x64\Debug

Dann liefert mir aber Application.StartupPath den Ordner

\*Benutzer*\Documents\Visual Studio 2017\Projects\*Projektname*\*Projektname*\bin\x64\

Gibt es dafür eine Lösung, oder mache ich da irgendwas falsch?

VG
Matthias

30.01.2019 - 14:34 Uhr

Hallo zusammen,
Zum Beispiel wollte ich den DialogResult des OK-Buttons erst auf "OK" ändern, wenn die Bedingung erfüllt ist, dies bewirkt aber, daß ich den Button 2x anklicken muß, um das Fenster zu schließen.


void ButtonOK_Click(...)
{
   if (IsInputOK())
   {
      DialogResult = OK
   }
   else
   {
        //Zeige Fehler irgendwie an
   }
}

?

13.11.2018 - 19:22 Uhr

Hi,
passt, geklärt. das "WorkingDirectory" hat nicht gestimmt.
Aufruf sieht jetzt so aus:

            ApacheServer = new Process();
            ApacheServer.StartInfo.FileName = Path.Combine(WorkingDir, "server", "mapache.exe");
            ApacheServer.StartInfo.EnvironmentVariables["DOKUWIKI_ROOT"] = WorkingDir;
            ApacheServer.StartInfo.WorkingDirectory = Path.Combine(WorkingDir, "server");
            ApacheServer.StartInfo.CreateNoWindow = true;
            ApacheServer.StartInfo.UseShellExecute = false;
            ApacheServer.StartInfo.RedirectStandardOutput = true;
            ApacheServer.StartInfo.RedirectStandardError = true;

            ApacheServer.Start();

            string stdOut = ApacheServer.StandardOutput.ReadToEnd();
            string erOut = ApacheServer.StandardError.ReadToEnd();

Die Umleitung des ErrorStreams werde ich wohl drinnenlassen, kann man sicherlich gut gebrauchen, um einen Fehler zu werfen 😉

Danke!

13.11.2018 - 19:00 Uhr

die Ausgabe der Kommandozeile kann man in eine Textdatei umleiten. Vielleicht funktioniert das ja auch bei deinem Aufruf.

Guter Tipp! Umleiten der Standardausgabe hat nicht gereicht, aber die der Errorausgabe:

            Process ApacheServer = new Process();
            ApacheServer.StartInfo.FileName = ApachePath;
            ApacheServer.StartInfo.UseShellExecute = false;
            ApacheServer.StartInfo.RedirectStandardOutput = true;
            ApacheServer.StartInfo.RedirectStandardError = true;

            ApacheServer.Start();

            string stdOut = ApacheServer.StandardOutput.ReadToEnd();
            string erOut = ApacheServer.StandardError.ReadToEnd();

Dann erhalte ich diese Fehlermeldung:> Fehlermeldung:

mapache.exe: Syntax error on line 13 of Z:/server/conf/httpd.conf: Cannot load php/ssleay32.dll into server: Das angegebene Modul wurde nicht gefunden.

Ich habe im Moment zwar noch keine Ahnung, was ich mit dieser Fehlermeldung anfangen soll, das dürfte google jetzt dann aber hoffentlich richten 😉

Wenn es sich hier "nur" um das Bereitstellen eines Dokuwikis handelt, dann muss man keinen kompletten Apache nutzen.
PHP hat seit der Version 5.4 einen eingebauten Webserver (
>
) welcher zumidnest zum Bereitstellen eines Dokuwikis taugt.

Danke für den Hinweis. Ich brauche halt einen Server, der nicht nur vom USB-Stick sauber startet, sondern auch aus einem Netzwerkverzeichnis, oder alternativ Netzlaufwerk. (@"\Server\Wiki\php.exe -S 0.0.0.0:3002 -t \Server\Wiki\www").
Könntest du das evtl. probieren?

Hinweis: der Webserver in PHP ist explizit nur für die Entwicklung gedacht; nicht zum hosten einer Anwendung.

Meist bezieht sich das ja zum Glück auf fehlende Sicherheit. Da der Server nur lokal verfügbar sein soll, kann ich das zum Glück eher missachten.

@da_user wie in den anderen Threads schon angemerkt: meinst Du nicht, dass Du Dich nicht mittlerweile enorm verrannt hast?
Du stolperst hier von einem in das andere Problem, weil Du einer Lösung nachläufst, die quasi einer extrem instabile, aufwändige Bastellösung gleicht.

Hättest Du evtl. ein paar Stunden in ein Konzept gesteckt, hättest Du Dir viel Zeit und Ärger sparen und dabei Dein Wiki sauber hosten können 😉

Wenn ich den in meinem Netzwerk betreiben wollen würde, hätte ich das Wiki schon längst sauber gehostet. Ist es halt leider nicht.
Und wenn ich gleich zum basteln angefangen hätte, hätte ich jetzt noch jede Menge Zeit und Nerven übrig.
Das läuft sowieso eher so nebenbei. Prinzipiell läuft das ganze ja schon mit der Batchfile-Lösung so dass man damit gut arbeiten kann. Hat mich bis dato weder viele Stunde noch großartig Nerven gekostet. Und sollte ich doch mal einen ordentlichen Serverplatz bekommen, kann ich ja zum Glück bequem umziehen 😉

13.11.2018 - 08:22 Uhr

Hi,

"eigentlich" relativ einfach.
Es gibt das DokuWiki welches es auch in einer "on a Stick" Variante gibt, mit einem minimalen Apache-Server der vom Prinzip wie eine Portable-App läuft. Problematisch ist, dass der nur von einem echten lokalen Verzeichnis läuft, ich das DokuWiki aber in einem Netzwerkverzeichnis ablegen möchte.
Ich habe mir jetzt die mitgelieferte Batch soweit angepasst, dass ich "nur" noch den Apache in ein lokales Verzeichnis kopieren muss, die Batch mapt mir dann das Netzwerkverzeichnis auf ein Netzlaufwerk und hinterlegt den Pfad dazu in einer Umgebungsvariable unter HKEY_CurrentUser (oder so ähnl.). Diese Umgebungsvariable habe ich in der ConfigDatei des Apache als "DocumentRoot" hinterlegt.
Mit der Batch funktioniert das ganze schonmal ganz gut und auch ziemlich stabil. Proof-of-Concept steht somit eigentlich soweit. Problematisch ist halt, dass das ganze noch nicht so komfortabel ist, wie ich es gerne hätte und es noch das eine oder andere Feature gäbe, dass ich da noch rein bringen würde. So ist z.B. zum sauberen beenden immer eine Benutzeraktion notwendig. Fenster der Batch-File schließen reicht nicht, macht man aber intuitiv.
Das geht halt mit einem "ordentlichen" Programm schöner, besser und übersichtlicher.
Ich würde auch nicht davon ausgehen, dass der Nutzer die Rechte hat, einen Dienst zu erstellen/starten.

Was mir hierbei kommt:
Die Umgebungsvariable setze ich mit der Option "EnvironmentVariableTarget.User", also nur für den Benutzer, da ich nicht davon ausgehe, Umgebungsvariablen für die komplette Maschine setzen zu dürfen. Process.Start startet aber m.W. Anwendungen mit anderen Rechten als die meinige Anwendung. Kann es da sein, dass der Apache-Server den ich über mein Programm starte, gar nix von der Umgebungsvariable wissen kann?
Auskunft dazu würde mir halt die Ausgabe geben, aber an die muss ich erstmal rankommen...

VG
da_user

12.11.2018 - 23:18 Uhr

Achso da habe ich deine Anforderung wohl missverstanden.

Kein Problem 😉

Ob mir der Exit-Code weiterhilft? Ich werde es morgen mal probieren.

Du hast nicht wirklich klar gemacht wofür du das ganze tun möchtest.

Der Apache soll ja eigentlich schön fröhlich im Hintergrund vor sich hinlaufen. Macht er aber nicht, er zeigt ganz schnell einen guten Schwung Text an, und schließt dann wieder. Ich vermute stark, dass in dem Text drinsteht, was ihm da nicht passt, bin aber nicht schnell genug, diesen zu lesen.

Edit:
Ich bin jetzt (erst!) tatsächlich auf die Idee gekommen, den Apache mal über die CMD zu starten. Ergebnis: der Parameter "/B" ist falsch. Habe ich aus einer Batch-File und bezieht sich dort auf den "start" Befehl.
Ohne den Parameter läuft er aus der CMD, aus dem C#-Programm leider nicht. Da habe ich jetzt immer noch das Problem, dass der zu schnell schließt um die Ausgabe lesen zu können.

12.11.2018 - 22:03 Uhr

Ok, eigentlich hätte ich das pl-pl im Link nicht durch de-de ersetzen müssen. 😉

"Console.Read" ist ja prinzipiell bekannt, aber in wie weit hilft mir das jetzt weiter? Ich kenne das jetzt in einem mir ähnlichen Anwendungsfall nur dazu, um zu sorgen dass sich das Fenster MEINER Konsolenanwendung nicht schließt. Ich will aber, dass sich das Fenster einer externen durch "Process.Start" gestarteten Konsolenanwendung nicht schließt.
In die kann ich schlechte ein "Console.Read" einbauen.

Oder kann ich diese Methode irgendwie dazu benutzen, die Ausgabe dieser ext. Konsolenanwendung einzulesen und in meinem Programm zu verarbeiten?

VG
da_user

12.11.2018 - 21:29 Uhr

Hi,

ich weiß nicht, ob ich das innerhalb von C# realisieren muss, oder ob ich auf einen anderen Trick zugreifen muss.
Mein Problem ist eigentlich relativ simpel, ich starte ein ext. Konsolenprogramm:

        private void RunApache()
        {
            string ApachePath = Path.Combine(WorkingDir, "server", "mapache.exe");
            System.Diagnostics.Process.Start(ApachePath, "/B");
        }

Dieses Konsolenprogramm (gut, Apache) taucht dann auch auf, spuckt mir jede Menge Text aus und schließt sich. Letzteres sollte nicht passieren, also gehe ich davon aus, dass dem Apache irgendwas nicht passt. Was? Keine Ahnung, so schnell kann ich nicht lesen!

Gibts einen Trick, wie ich verhindere dass sich das Konsolenfenster gleich wieder schließt, sobald der Apache beendet ist?

VG
da_user

26.10.2018 - 09:11 Uhr

Ein Entwickler entwickelt Dinge. Deswegen heisst er Entwickler - und dazu gehört auch, dass man Dinge ausprobiert.

Weils manchmal Dinge gibt, die beim ausprobieren funktionieren, im "produktiven" dann aber wiederrum nicht 😉

Aber ich werde es einfach ausprobieren.

Danke fürs nochmalige Titel editieren

25.10.2018 - 14:01 Uhr

C# ist eine Sprache; kein Framework.
Daher wäre die Frage, ob es nicht in .NET eine Möglichkeit gibt.

Argh... meinte ich ja.

.NET wiederum ist an vielen Stellen nur ein Wrapper der Win32 API.
Ergo; wenn es in .NET selbst keine Implementierung der jeweiligen Funktion gibst - sofern es dazu eine Win32 Funktion gibt, wovon ich ausgehe - kannst Du diese mit Hilfe des .NET Framework und PInvoke selbst implementieren.

Das wäre genau das, was das der Code im Link macht.
Darum wäre natürlich meine erweitere Frage, ob der Code den Thread "blockiert". Ich also danach sofort prüfen kann, ob das Netzlaufwerk verbunden oder nichtverbunden ist. Oder ob ich nach starten der Methode regelmässig prüfen muss, ob das Netzlaufwerk den jetzt schon verbunden ist?

PS:
Somit passt also die (wohl von dir) geänderte Überschrift nicht.

24.10.2018 - 17:39 Uhr

Hi,

ich habe mal ein, zwei kurze Fragen zum verbinden von Netzlaufwerken mit "WNetAddConnection2", welches ich so implementeiren möchte: SO: Map network drive programmatically in C# on Windows 10. Zunächst finde ich die schonmal schöner als die klassische Methode über "net use", frage mich allerdings, ob es da nicht mittlerweile eine noch schönere, vielleicht in C# eingebaute Variante gibt?
Und dann natürlich die wichtigste Frage: blockiert die Variante von SO mein Programm, solange bis das Verbinden geglückt, bzw. fehlgeschlagen ist?
Denn nach dem Verbinden soll mein Programm natürlich was mit dem Netzlaufwerk anstellen, und entweder ich prüfe dann gleich nach der Ausführung der entsprechenden Methode, ob das Netzlaufwerk verbunden ist, was die weniger aufwendige Methode ist, oder ich muss halt alle x-ms prüfen und dann ein Event schmeißen.

Oder vielleicht hat ja jemand eine ganz andere Idee?

VG
da_user

19.10.2018 - 13:43 Uhr

Na, dann muss ich mich da mal auf Experimente einlassen.
Danke.

19.10.2018 - 13:18 Uhr

Warum: Netzwerke gelten per default als unsichere Quelle.
Wenn Du nun programmatisch ein Programm von einem Netzwerklaufwerk holst und das starten willst, dann erhoffe ich von Windows erst mal ein Blocken durch dessen Sicherheitsfeatures.

Beim manuellen kopieren klappts einwandfrei, ist die Vorgehensweise von Windows hier eine andere?

Letzten Endes wäre die saubere Lösung:
Programm wird unter Program Files (read only) installiert und Progamm-Daten in den ProgramData Ordner.

Die saubere Lösung wäre, DokuWiki ordentlich in einen Webserver zu installieren. Geht leider nicht, so dass ich nunmal Klimmzüge machen muss.

Prinzipiell handelt es sich ja um eine PortableApp, die halt nicht auf einem USB-Stick sitzt, sondern auf dem Rechner. Bis dato verwende ich dazu den "Downloads"-Ordner. Der funktioniert, ist aber halt irgendwie unschön. Irgendein Temp-Ordner oder so würde mir da besser gefallen.

19.10.2018 - 12:29 Uhr

Ich will ein Programm welches nur lokal funktioniert, aber im Netzwerk gespeichert ist, ausführen.
Das Programm ist der MicroApache-Server.

Ich will mir dazu ein kleines C#-Progrämmchen schreiben, dass dann u.A. diesen MicroApache-Server in dieses gesuchte lokale Verzeichnis kopiert, und dann ausführt.

Letzten Endes geht es darum, DokuWiki in einem Netzwerksverzeichnis ohne Webserver im Netzwerk zu betreiben. Darum DokuWikiOnAStick. Der da mit gelieferte MicroApache-Server läuft aber nur aus einem wirklich lokalen Verzeichnis. Auch Netzlaufwerk funktioniert nicht.

An den Desktop habe ich auch schon gedacht, gefällt mir aber jetzt nicht so...
Wie siehts den mit AppData aus? Das wären ja das Konfig-Verzeichnis für den aktuellen Benutzer. Aber darf man aus denen heraus ein Programm starten?

können wir Dir hier 98724324 Möglichkeiten anbieten

Ja bitte, ich suche mir dann die passende schon selbst raus :evil: 😁 8)

19.10.2018 - 12:02 Uhr

Hi,

gibt es in einer Windowsinstallation ein Verzeichnis auf das auch für Nutzer mit eingeschränkten(!) Benutzerkonten sicher(!) folgende Bedingungen zutreffen:

* lokal (kein ActiveDirectory, Netzlaufwerk od. ähnl)
* beschreibbar
* darin liegende Programme dürfen ausgeführt werden, sofern sie keine höheren Rechte benötigen

Natürlich unter der Voraussetzung, dass das Benutzerkonto nicht soweit eingeschränkt ist, dass gar keine Programme ausgeführt werden dürfen. Z.B. PortableApps vom USB-Stick funktionieren.

12.06.2018 - 18:40 Uhr

Hi,

ja, da mache ich mir keine Sorgen, da fallen wir nicht drunter.

Aber wahrscheinlich muss ich mir sowieso was anderes Überlegen, wenn das von Grund auf nicht Möglich ist.

11.06.2018 - 19:35 Uhr

Hi,

ich habe hier einen Rechner ohne Internetzugang, welcher aus Gründen auch keinen bekommt, auf dem die CE von VS2017 laufen soll.
Installieren ging ja mit ein paar Klimzügen. Aber ohne Internet kann ich mich nicht in meinen MS-Account einloggen um das VS zu aktivieren.

Gibt's Möglichkeiten?

VG
da_user

05.02.2018 - 11:09 Uhr

ganz verstehe ich deine Frage nicht.

Zitat:
jede Datentabelle für sich in die Datenbank legen

Wie sonst? Od. ich verstehe eben wie gesagt die Frage nicht.

Die Frage ist eher, ob ich jede einzelne Tabelle/Objekt mit jeweils einem DataContext abbilde, oder die gesamte "Datenbank" mit einem einzelnem.

Ich mach mal schnell hingekritzelten Pseudocode, ich hoffe der veranschaulicht da Problem:


class Table1
{
    int ID;
    int Data1;
    int Data2;
}

class Table2
{
    int ID;
    int Data1;
    int Data2;
}

class TableView
{
    int ID;
    int Data1 = Table1.Data1;
    int Data2 = Table1.Data2;
    int Data3 = Table2.Data1;
    int Data4 = Table1.Data2;
}

class Database
{
    TableView tv;
    //[... weitere Tabellen & Views]
}

Mache ich jetzt:


    public class DatabaseContext : DbContext
    {
        public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options)
        { }

        public DbSet<Database>;
    }

oder:


    public class DatabaseContext : DbContext
    {
        public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options)
        { }

        public DbSet<Table1>;
        public DbSet<Table2>;
    }

und bilde "TableView" und "Database" nur im Code ab, weil in der SQL-Datenbank brauche ich die dann ja gar nicht erst.

Oder doch eher komplett:

public class DatabaseContext : DbContext
    {
        public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options)
        { }

        public DbSet<Table1>;
        public DbSet<Table2>;
        public DbSet<TableView>;
        public DbSet<Database>;
    }

Eigentlich ist das EF in ASP.NET deplatziert.
EF hat eher in Desktop-Anwendungen einen Sinn als in Webanwendungen.

Wie greife ich den sonst aus einer ASP.NET Webanwendung auf eine SQL-Datenbank zu, wenn nicht übers EntityFramework?

Datenbank-Objekte haben auch in einer ASP.NET Page nichts zu suchen.
[Artikel] Drei-Schichten-Architektur

In ASP.NET hat man wie mit jeder anderen Anwendungstechnologie ebenfalls ViewModels.
ASP.NET MVC - Arbeiten mit View- und SubmitModels

MVC ist umgesetzt, die Datenbank hängt im Model und natürlich nicht in der ASP.NET-Page. Der erste Absatz des verlinkten Artikels liest sich aber schonmal interessant. Den führe ich mir heute noch zu Gemüte!

04.02.2018 - 20:00 Uhr

verwendetes Datenbanksystem: MS-SQL lokal

Hi,

ich habe mich gerade etwas in ASP.NET und infolge dessen auch in das Entity Framework nach dem "Code-First" Prinzip eingearbeitet.
Ich hätte da ein Projekt anstehen, bei dem ich in der Datenbank einige Tabellen und auch Datenbankviews (=> Tabellen die selbst keine Daten enthalten, sondern Daten aus verschiedenen Tabellen darstellen) liegen müssten.
Nun, bevor ich mich da irgendwie in eine Sackgasse bewege, hätte ich da eine kurze, hoffentlich einfache Designfrage:

Sollte ich lieber jede Datentabelle für sich in die Datenbank legen, mit jeweils einem eigenen DataContext und die Views entsprechend nur in meinem C#-Code?
Oder sollte ich lieber mit meinen Klassen die komplette Datenbank in ein einzelnes Objekt abbilden und für dieses dann ein einziges DataContext anlegen?

22.01.2018 - 20:37 Uhr

Wieder ein Klassiker.
Ich habe jetzt natürlich nur nach ASP.NET in Kombination mit UWP gegoogelt.

Dankeschön!

22.01.2018 - 18:54 Uhr

Hi,

ich möchte auf einem RaspberryPi2/3 eine Anwendung entwickeln, die per Webinterface ansprechbar ist.
Da ich mich im Ökosystem der .NET Welt doch etwas heimischer fühle, als unter den Linux-Pendants, würde ich dazu gerne Windows IoT auf den Raspberry einsetzen.

Dazu hätte ich mich jetzt in die Thematiken ASP.NET (Zwecks dem Webinterface) und UWP (auf Windows IoT laufen wohl nur UWP-Apps auf ARM-Plattform kompiliert).

Jetzt habe ich mit Google-Recherche herausgefunden, dass ASP.NET nicht unbedingt unter Windows IoT läuft: https://social.msdn.microsoft.com/Forums/vstudio/en-US/eb9c3cb0-8ac3-4df6-9b87-7d56fe8311f1/uwpis-it-possible-to-use-aspnet-core-in-a-universal-windows-application?forum=wpdevelop

Allerdings ist dieser Beitrag von Ende 2016, was Neueres habe ich nicht gefunden. Darum würde ich gerne, bevor ich meine Zeit in's falsche versenke, hier nachfragen, ob das überhaupt läuft? Bzw. auf welche Alternativen ich setzen könnte?

VG
da_user

02.03.2017 - 12:10 Uhr

Dafür bekomme ich dann u.A. Probleme mit meinem

Parallel.Foreach  

Ja, das ist logisch, weil es erst mit dem .NET-Framework 4.0 eingeführt wurde.

Ja, aber man kann über NuGet die TaskParallelLibrary nachinstallieren. Offensichtlich auch offiziell von MS. Die scheint aber trotzdem nicht ganz so einwandfrei zu funktionieren, wie die in .NET 4.0.

bzw. die Auflistung unter "Programme und Funktionen"/"Software" des Betriebssystemes.

Da finde ich tatsächlich auch keinen Hinweis auf .NET4.6.2, nur auf .NET4.6.1. Nach kurzem googeln weiß ich jetzt auch, dass die 4.6.2 für W10 wohl erst mit dem Anniversary Update kam.
An meinem W10 werden die Upgrades erst später eingespielt, und wann welches W10-Upgrade kam, da habe ich sowieso den Überblick verloren.
Zudem stellt sich mir die Frage, warum das Programm den dann "außerhalb" lief...
Wichtig ist jetzt aber, dass es mit .NET 4 einwandfrei läuft.

Danke fürs Testen und grübeln! 😉

02.03.2017 - 11:30 Uhr

Dafür bekomme ich dann u.A. Probleme mit meinem

Parallel.Foreach

Ich habe jetzt auf .NET 4 umgestellt und damit scheint es zu funktionieren.

Ich stelle übrigens gerade fest, dass laut dem Info-Dialog des VisualStudios nur das .NET Framework 4.6.01586 installiert ist. 8o

01.03.2017 - 12:29 Uhr

Weiterhin ist mir aufgefallen, dass in dem Artikel folgendes steht:

Dieses Problem lässt sich beheben, in dem man in den Projekteigenschaften (Rechtsklick auf das Projekt im Projektmappen - Explorer) unter "Anwendung" als Ausgabetyp "Windows-Anwendung" eingestellt.
Das ist bei dir nicht umgestellt.

Oh, das ist mir total entgangen 8o 8o
Umgestellt -> brachte keine Veränderung

Also ich würde an deiner Stelle einmal das Beispielprojekt umsetzen - und gucken ob das geht. Stichwort "Minimalprojekt".

Ich habe es jetzt ehrlich gesagt mal ein bisschen anders gemacht: Am Ende des Artikels verlinkt der Autor auf einen weiteren Blogeintrag mit einen Screensaver den er erstellt hat (http://csharp-tricks.blogspot.de/2010/07/matrix-screensaver.html). Dort habe ich mir den Quellcode heruntergeladen, kompiliert (als Debug) und den selben Vorgang durchgeführt. Auch hier erhalte ich den Shim-Fehler.

Edit: noch ein Test: Auch der bereits Kompilierte Matrixscreensaver, den der Autor auch unter obigen Link anbietet, erzeugt den Shim-Fehler.

28.02.2017 - 15:02 Uhr

Fehlen irgendwelche Infos oder war bis jetzt noch keiner hier, der den Fehler kennen würde?

Ich habe mal versucht, mein Project ein bisschen auf Vordermann zu bringen und angehängt. So kann sich evtl. jeder selbst ein Bild davon machen.

24.02.2017 - 19:18 Uhr

Hi,

ich habe mir einen Bildschirmschoner gebastelt. Prinzipiell bin ich als erstes nach dieser Anleitung vorgegangen: https://csharp-tricks.blogspot.de/2010/07/bildschirmschoner-screensaver-erstellen.html

Der Schoner läuft soweit. Sowohl im Debugmodus aus VS heraus, wie auch das Release wenn ich es per CMD starte.
Habe dann wie in der Anleitung empfohlen die .exe in .scr umbenannt, und weil ich nicht wusste, was alles gebraucht wird, aus dem Ordner herausgeholt und von dort aus per CMD gestartet. Also ohne das die ganzen .pdb, .config, vhost,.. dabei sind. Lief einwandfrei!
Also die .scr in den Windows/System32 Ordner kopiert und tada, wird mir auch in den Bildschirmschonereinstellungen angezeigt.

Wenn ich den dann aber auswähle, erhalte ich folgende Fehlermeldung:> Fehlermeldung:


MMDSScv.scr - This application could not be started.

This application could not be started.

Do you want to view information about this issue?

Ja Nein

Weitergeleitet werde ich dann auf diese für mich als "Entwickler" nichtssagende Seite: https://support.microsoft.com/de-de/help/2715633/shim-errors-for-the-.net-framework-version-and-platform-support

.NET ist natürlich aktiviert, und an den Entwickler habe ich mich auch gewendet (den kenne ich sehr gut, seit seiner Geburt!), aber der ist genauso Ratlos. Über Google habe ich auch schon jemanden gefunden der das Problem hatte, der hat es gelöst, in dem er den Bildschirmschoner in C:\Temp verschoben hat. Bringt aber nix, Windows soll den finden und starten! (https://stackoverflow.com/questions/30642392/shim-noversion-found-error-while-trying-to-run-screensaver-from-preview)

Ich habe auch schon probiert, die zurückgelassenen Dateien ebenfalls umzubenennen (exe => scr) und mit in System32 zu kopieren, hat aber auch nix gebracht.

Was mache ich den hier falsch? Wie kann ich das Problem lösen?

Ach ja, könnte ja evtl. was damit zu tun haben: Buildtarget: Release/AnyCPU.

VG
da_user


Edit:
Ich habe den Bildschirmschoner gerade eben auf einem zweiten Windows10 Gerät "installiert" (der erste PC ist übrigens auch W10). Gleicher Fehler.
Zur Sicherheit habe ich jetzt auch nochmal in den "Windows-Funktionen ein- oder ausschalten" nochmal ganz sicher alles mit .NET aktiviert, der Fehler bleibt bestehen.

31.10.2016 - 17:37 Uhr

Wäre natürlich eine Überlegung wert.

Mein Gedanke war allerdings, den Text erstmal in ein verarbeitbares Objekt zu packen, und erst später zu analysieren, was da jetzt eigentlich genau drinnen steht und wie der Code aufgebaut ist. Verschiedene Sprachen werden wohl auch nicht zum Einsatz kommen. Eher mal weitere Befehle.

Natürlich "trotzdem" vielen Dank für deinen Hinweis 😉

30.10.2016 - 14:20 Uhr

Hi,

zwar nicht die Ideallösung die ich eigentlich gerne gewollt hätte, aber definitiv das "kleinste Übel" 😉

Ich denke ich werde das ganze so machen. Vielen Dank!

Matthias

29.10.2016 - 19:47 Uhr

Ja, das ist schon eine Lösung, habe ich auch in einem anderen Teil des Programmes (einfacherer Parser) so gemacht.

Hier müsste ich aber im späteren Programmcode wahrscheinlich öfter auf das Zugreifen, was der Parser ausspuckt, und dann natürlich auch Effizient auswerten.

Ist ein Aufruf nach dem Motto:

 if(GeparsteCodeZeile[i].CommandType == commands[x])

effizient?

Meine Idee wäre noch, CommandType mit Hilfe eines Instanzenzählers mit einer eindeutigen Nummer zu versehen:

public class CommandType
{

    public CommandType(string name, string value)
    {
          ThisIndex = Counter;
          Counter++;
    }

    static int Counter = 0;
    
    public int ThisIndex;
}

Dann könnte ich immer auf diesen Index prüfen, wäre unter'm Strich auch nix anderes als eine Enumeration, nur halt nicht so schön lesbar.

29.10.2016 - 17:54 Uhr

Hi,

ich bastel derzeit an soetwas wie einen Code-Parser. Dazu habe ich mir ungefähr folgendes Vorgehen ausgedacht:

Der Parser geht Zeilenweise durch den Code. Jede Zeile besteht im Prinzip aus einem Befehl und einem darauffolgenden Wert in Klammern; oder entsprechende Steuerzeichen (z.B.: '{' & '}'). Der Parser soll die Zeile entsprechend aufteilen, den Befehl mit aus einer Befehl-Defintions-Klasse heraussuchen und für jede Zeile entsprechend ein Objekt speichern, dass den Befehl definiert und den Wert enthält.

Als Befehl-Defintions-Klasse wäre mir eigentlich eine einfache Enumeration mit Strings am liebsten, ungefähr so:

enum CommandTypes
{
     curlyBracesOpen = "{",
     curlyBracesClose = "}",
     usingCommand = "using",
     consoleWriteLineCommand = "ConsoleWriteLine",
     [....]
}

Das hätte den Vorteil, dass ich an einer zentralen Stelle neue Befehle einfügen kann und sofort den String zur Verfügung hätte, auf den der Parser kontrollieren muss. Zudem würde ich natürlich das jeweilige Enum-Element in dem ausgewerteten Objekt hinterlegen und könnte das dann entsprechend schnell und effizient abfragen.

Problem: ich kann die Enumeration nicht in einer foreach Schleife durchgehen und nicht zuletzt basiert eine Enumeration nunmal auf ganzen Zahlen, zu denen ich keine Strings hinterlegen kann.

Alternativlösung wäre natürlich eine Liste von Objekten, in denen der String enthalten ist, auf den zu Prüfen ist, und das dazupassende Element einer Enumeration. Dann müsste ich aber immer an zwei Stellen den Code erweitern, wenn ein Befehl dazukommt: Die Enumeration braucht ein neues Element und auch die Liste.

Gibts den evtl. eine schöne Lösung für mein Problem?

VG
Matthias

29.10.2016 - 17:32 Uhr

Hi,

habe in den letzen Tagen noch etwas weiter geforscht. Die WMI-Klasse Win32_Volume zeigt den Container an.

THX

20.10.2016 - 18:48 Uhr

Noch ein Indiz: Das "Laufwerk" taucht auch nicht in der Datenträgerverwaltung auf

19.10.2016 - 21:45 Uhr

welcher Name wird denn im Explorer für das virtuelle Laufwerk Z: angezeigt? Kannst du den Namen ändern oder ist das eine generische Bezeichnung?

Zuerst VeraCryptContainer was ich dann in VCC unbeannnt habe. Damit dürften biede fragen beantwortet sein 😉

Welchen Wert hat
>
?

Ähm:

DriveLetter: Z:\Type: Fixed DriveName:

😉

19.10.2016 - 18:00 Uhr

Ich habe jetzt auch mal über EFS_Volume und EFS_PhysicalDisk nachgesehen.

In beiden wird das VC-Laufwerk gar nicht angezeigt, also auch kein Laufwerksbuchstabe für das Volume.

17.10.2016 - 21:21 Uhr

Hi,

ich experimentiere gerade etwas, folgender Quellcode:

        public void Button2Click()
        {
            foreach (System.IO.DriveInfo df in System.IO.DriveInfo.GetDrives())
            {

                string text = "DriveLetter: " + df.Name + "Type: " + df.DriveType;
                if (df.IsReady)
                {
                    text += " DriveName: " + df.VolumeLabel;
                }
                else
                {
                    text += " Drive not Ready";
                }
                CmdOutPutBoxWriteLine(text);
            }
        }

Für alle (bereiten) Laufwerke außer C:\ und einen als Z:\ eingebundenen VeraCrypt-Container werden die Laufwerksnamen (VolumeLabel!) angezeigt. C:\ funktioniert nach einer Unbenennung von "Lokaler Datenträger" nach "System" auch. Nur der das VolumeLabel für Z:\ wird nicht angezeigt:

Fehlermeldung:
DriveLetter: Z:\Type: Fixed DriveName:

Ist an diesem Laufwerk irgendwas anders, so dass ich mit dem normalen DriveInfo nicht auf das VolumeLabel zugreifen kann? Wie komme ich den ansonsten da dran?

VG
da_user

04.10.2016 - 17:28 Uhr

Hi,

ich habe jetzt bereits etwas mit dem Taskscheduler gearbeitet. Nun würde ich gerne eine Aufgabe erstellen, deren Trigger davon ausgelöst wird, dass ein USB-Laufwerk eingesteckt wird.
Funktionieren tut das ganze manuell so: https://www.itwelt.org/anleitungen-howto/windows/612-automatisch-eine-aufgabe-ausfuehren-beim-anschliessen-eines-usb-laufwerks
Das ganze funktioniert bei mir und soll jetzt in das Programm übernommen werden. Dazu 2,5 Fragen:

1.) Wie erstelle ich einen entsprechenden Trigger?
und/oder
1,5.) wie übergebe ich die XML-File aus dem Link dem Link dem TaskSchudler? Das File jeweils anzupassen wäre ja auch kein Problem.
und
2.) Wie ermittle ich mit meinem Programm zu einem bestimmten Laufwerksbuchstaben den Pfad zum Gerät?

Ergänzungsfrage, wenn ich schon dabei bin:
Ich habe festgestellt, dass der Tasksheduler beim kompilieren oder beim Aufruf nen ganzen Schwung an Dateien in meinem Programmverzeichnis (bin/Debug) erzeugt. Kriege ich die irgendwie in einen Unterordner (z.B. bin/Debug/TaskScheduler oder AppData\Roaming\Programm\TaskScheduler)?

Viele Grüße
Matthias/da_user

22.09.2016 - 20:38 Uhr

Klingt logisch.

THX

22.09.2016 - 20:10 Uhr

Gerade eben habe ich es auch gesehen, ich habe dem MainWindow den Typ Form zugeteilt, nicht MainForm, und dann als MainForm instanziert.

Bin leider nicht mehr rechtzeitig zum löschen gekommen, nun bleibt der nächste Flüchtigkeitsfehler für immer im Internet... 😉

Danke!

Aber:

Schau dir auch die Namenskonventionen unter .net an, dann wird es gewohnter und leichter zu lesen.

Ich habe eigentlich die "Capitalization Conventions C#" hier neben mir am Bildschirm hängen, aber die Schreibweise für Objekte fehlt hier, war der Meinung, die schreibt man auch CamelCase?

22.09.2016 - 19:52 Uhr

Hi,

es ist garantiert wieder nur eine Kleinigkeit, aber ich finds einfach nicht...

Ich habe eine Form "MainForm" erstellt, welche als "MainWindow" instanziert wird. Die "MainForm"-Klasse hat natürlich von "Form" geerbt. Jetzt habe ich in die "MainForm"-Klasse eine Methode (public natürlich) geschrieben, auf die ich von meinem Programm aus zugreifen will. Der Kompilier sucht diese allerdings wohl in "Form".
Schnell mal Quellcode auszugsweise:


    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        public void myMethod()
        { }
    }
[...]
        static void Main(string[] astrArg)
        {
            MainWindow = new MainForm();
            MainWindow.Show();
            MainWindow.myMethod();
        }

Fehler ist:> Fehlermeldung:

CS1061 "Form" enthält keine Definition für "myMethod", und es konnte keine myMethod-Erweiterungsmethode gefunden werden, die ein erstes Argument vom Typ "Form" akzeptiert (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis).

MainWindow ist aber vom Typ MainForm, warum wird den die Methode augenscheinlich darin gar nicht gesucht?

Dankeschonmal fürs durchlesen 😉
Matthias/da_user

21.09.2016 - 15:58 Uhr

Tatsache, die Assembly war nicht eingebunden...

Man sollte halt nicht von einem gewissen Verhalten auf ein anderes schließen.

Danke!

21.09.2016 - 15:42 Uhr

Hi,

ich versuche mich gerade an dem Codebeispiel für die Kommunikation zwischen zwei Anwendungsinstanzen für Net 2.0: Dateiassoziation: Neue Dateinamen an die laufende Anwendung übergeben und habe das Problem, dass aus welchen Gründen auch immer, der Ipc-Namespace nicht gefunden werden kann:> Fehlermeldung:

Der Typ- oder Namespacename "Ipc" ist im Namespace "System.Runtime.Remoting.Channels" nicht vorhanden. (Möglicherweise fehlt ein Assemblyverweis.)

Laut MSDN befindet sich der Ipc-Namespace genau da wo ich ihn suche (https://msdn.microsoft.com/de-de/library/system.runtime.remoting.channels.ipc.ipcchannel(v=vs.110).aspx), da scheint sich also nix verschoben zu haben. Und da System.Runtime.Remoting gefunden wird, sollte die Assembly System.Runtime.Remoting.dll auch eingebunden sein.

Also: was mache ich den hier falsch?

VG
Matthias