Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Abt
Thema: Directory.CreateDirectory warten bis abgeschlossen
Am Heute, im Forum: Grundlagen von C#

DevOps ist ein Prozess und kein Tool.
Eigentlich jede Software lässt sich automatisiert im Build umsetzen. Hab das auch schon mit Ansi C für Controller gemacht.

Spätestens wenn man beachtet, dass man mindestens 10 Jahre jede Software und jedes Artefakt, wozu eine Firmware gehört, rechtlich aufbewahren muss, ist der Aufwand eines solchen Prozesses ein Vielfaches geringer - einfach weil es dafür standardisierte Wege gibt, die solche Vorgaben beachten.
So wusstest du davon vermutlich gar nichts und erfüllt vielleicht daher auch nicht diese Vorgabe :-)

Aber ja bei DevOps ist das leider wie bei der IT Security, nur dass du bei DevOos mit einem kleinen Invest sehr viel Arbeit in der Zukunft sparen kannst. So hast du ein Tool dass meistens über die Zeit mehr Geld und Aufwand kostet als wenn du Standardmittel verwendet hättest.
Blinde Augen und taube Ohren: Es gibt immer das Budget vor einem Security Leak und nach einem Security Leak.

Thema: Jede Datei überprüfen - ggf. Dummy Datei erstellen.
Am Gestern, im Forum: Grundlagen von C#

Also Deine ungarischen Notation tut in den Augen echt weh, da muss man Palladin recht geben...

Zitat
Meinst du so und nur bei strZusatz oder generel?
Immer, ausnahmslos immer. Siehe auch die Doku zu Path.Combine.
Daher solltest Du auch


File.CreateText(Path.Combine("D:\S7_Export\AppData\" , strFolder , strDummy[i])
schreiben und nichts anderes.

Deine Änderung


using (StreamWriter myWriter = File.CreateText(@"D:\S7_Export\AppData\" + strFolder + strDummy[i]))
{
    myWriter.Close();
}
ist besser, aber unnötig auwendig.
Schau Dir doch wenigstens an, was die Methoden und Co tun, wenn Du sie verwendest.
Aber ein manuelles Close bei einem using() ist absolut sinnfrei - dass Du jetzt das Handle schließt jedoch korrekt.


using (File.Create(filename)) ;
// oder 
File.Create(filename).Dispose();
// oder 
File.WriteAllText(filename, String.Empty);

Eine Fehlermeldung wie
Fehler
System.IndexOutOfRangeException: "Der Index war außerhalb des Arraybereichs."
bekommst Du sehr sehr einfach selbst raus, wenn Du Deinen Code debuggst.
[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Zum Fehler
Fehler
System.ArgumentException: "Illegales Zeichen im Pfad."
und der Aussage
Zitat
Ich verstehe es so das die geschweifte Klammer das illegale Zeichen ist.
ist es aber so, dass Du dann offenbar nicht den Fehler verstehst :-)
Du verstehst hier den Debugger-Eintrag nicht, denn {string[6]} zeigt Dir nur an, dass sich im Array sechs Elemente befinden.
Schau Dir daher die Doku zum Debugger an. Du wirst es mächtig schwer haben, wenn Du den Debugger nicht oder falsch anwendest.

Dein Illegales Zeichen ergibt sich aus


Path.Combine(Job1, ext);
genauer gesagt ext.
ext ist bei Dir *.* und * ist eben ein illegales Zeichen.

Thema: Neuer Mvvm Code Generator von Thomas C. Huber
Am im Forum: Smalltalk

Bin mir nicht sicher, ob Blogposts für sich extra Themen wert sind - aber nun ja...

Dass solche Gens jetzt vermehrt kommen werden, war ja im Endeffekt durch Source Generators klar.
Siehe auch sein tweet mit den entsprechenden Kommentaren dazu.

Thema: DirectoryInfo aktualisiert sich nicht von alleine: Warum?
Am im Forum: Grundlagen von C#

Zitat von Sascha8192
Dann habe ich wohl ein Feature gefunden das wahrscheinlich mit der IF zusammen hängt.
Nein hast Du nicht, weil das technisch nicht mal funktionieren kann - nicht mal im Ansatz.

DirectoryInfo ist nichts anderes als ein Wrapper für ein FileSystem-Handle, das vom Betriebssystem erzeugt wird.
Das bedeutet, dass alle Informationen nur beim Laden des Objekts gezogen werden.
Zitat von Sascha8192
Falls Jemand für dieses Verhalten eine Erklärung hat, nur her damit.
Dazu kannst Du Dir einfach den Quellcode von DirectoryInfo anschauen und die Dokumentationen der Win32 API durchlesen, die jeweils aufgrufen wird.

Alle üblichen Dateisysteme sind aber technisch gesehen asynchron, weshalb es zum Beispiel auch diesen Thread hier gab.
Directory.CreateDirectory warten bis abgeschlossen
Das heisst, dass ein neues Handle nicht zwangsläufig neue Informationen beinhalten muss einfach, weil ein entsprechender Operation Commit vom Betriebssystem zu Dateisystem noch nicht erfolgt ist.
Das passiert vor allem bei langsame Datenträgern mit NTFS.

-> Das Objekt wird sich niemals von selbst aktualisieren.

Thema: Fritz!Box - IP-Client - DynDNS
Am im Forum: Smalltalk

Die Fritzbox is halt leider eher so nen Heimspielzeug, auf der Du nich viel konfigurieren kannst.
Mächtigere Systeme wie zB. das UniFi Zeug synchen Deine IP periodisch, sodass Du keinen Reconnect-Trigger benötigst.
Auch das VPN der Fritzbox kann man kaum ernst nehmen, obwohl zumindest die App eingiermaßen komfortabel ist.

Bei mir is die Fritzbox vom Provider auch nur der Connection Gateway; alles dahinter gescheite UniFi Hardware.
IIRC bleibt Dir hier mit der Fritzbox kaum was anderes als nen externes Tool oder die Provider-Fritzbox zu verwenden.

Thema: Directory.CreateDirectory warten bis abgeschlossen
Am im Forum: Grundlagen von C#

..und für sowas nutzt man eigentlich ein Release System wie zB Azure DevOps :-)

Das Buildsystem erzeugt die Software und packt daraus ein Artefakt (zB Deine ZIP).
Das Release System stellt diese ZIP dann entsprechend zur Verfügung, zB auf einer Share oder einem anderen Storage.

Komme auch aus dem Maschinenbau und berate Maschinenbaufirmen seit vielen vielen Jahren solche Prozesse zu standardisieren und gerade zu ziehen :-)

Thema: Directory.CreateDirectory warten bis abgeschlossen
Am im Forum: Grundlagen von C#

Bis auf dass man Pfade nicht mit String Frickerleien zusammen baut, sondern mit Path.Combine ist das ok.
Deswegen kann es gut sein, dass Du einfach in die Fakten meines Beitrags läuft. Da hilft leider nur ein Delay.
Gibt aber leider keinen fixen Wert für einen Delay, da dies auf das OS und die Hardware/Systemauslastung ankommt bzw. unterschiedlich ist.

Kann das sein, dass Du hier etwas baust, das eigentlich ein Release System automatisch machen sollte..?
Frage nur wegen den Bezeichnern.

Thema: Defender erkennt Trojan:Script/Wacatac.B!ml bei InnoSetup
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

So schnell wie Du geantwortet hast, kannst ja nich wirklich gesucht haben ;-)

Google Suche nach "innosetup Trojan:Script ico"
Erster Treffer -> inno setup executable seen as a Virus

Thema: Defender erkennt Trojan:Script/Wacatac.B!ml bei InnoSetup
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Installer Platformen und nicht signierte Software (-> Microsoft Signcode) lösen sowas gern aus.
Bei InnoSetup hab ich schon oft gelesen, dass es am Ico liegen kann.

Thema: Filter Liste mit Linq
Am im Forum: Rund um die Programmierung

Als Hinweis für die Mikro-Optimierer: die "vereinfachte" Schreibweise ist i.d.R. nicht die schnellste.
.Where(predicate).First() ist schneller und erzeugt weniger Allocations als .First(predicate); das gilt für alle Anwendungen von .Where().
Hintergrund ist (vereinfacht), dass zB First() auf einer Schleifen-Implementierung basiert und .Where() auf die Iteratoren der Collections zurück greift.

Hier ein Benchmark Beispiel:


public class LinqTest
{
    private List<string> _list;

    [GlobalSetup]
    public void Setup()
    {
        _list = Enumerable.Range(0, 100).Select(c => c.ToString()).ToList();
    }

    [Benchmark]
    public int WherePredicate() => _list.Where(e => e.Contains("a")).Count();

    [Benchmark]
    public int CountPredicate() => _list.Count(e => e.Contains("a"));
}

BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19042
.NET Core SDK=5.0.300-preview.21180.15

|         Method |       Mean |    Error |   StdDev |
|--------------- |-----------:|---------:|---------:|
| WherePredicate |   504.7 ns | 11.90 ns | 11.13 ns |
| CountPredicate | 1,166.8 ns | 11.30 ns | 10.57 ns |

Der Unterschied 504 vs 1166 ns ist schon enorm :-)

PS: ToList sollte bewusst eingesetzt werden, nicht Random.
Intermediate materialization (C#)

Einstieg zum Thema Linq, und wie es funktioniert:
101 LINQ samples - Code Samples

Thema: Event wird nicht aboniert
Am im Forum: Grundlagen von C#

Was genau hast Du vor?

In WPF arbeitet man eigentlich nicht primär mit Events. WPF ist so konzipiert, dass der MVVM Pattern verwendet werden sollte.
[Artikel] MVVM und DataBinding

Thema: Dateien per Ethernet auf anderen Rechner schreiben
Am im Forum: Netzwerktechnologien

Mit der Informationen an Anforderungen, die Du hier nennst, kommen hunderte von potentiellen Lösungen in Frage.
Die einfachste ist natürlich HTTP.

Thema: Methodennamen dynamisch erstellen / ansprechen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

[FAQ] Variablennamen zur Laufzeit zusammensetzen / Dynamisches Erzeugen von Controls

In Deinem Fall riecht es aber eher danach, dass Du einen Event für alle Controls verwenden kannst und daher der Wunsch nach der Laufzeiterzeugung eher ein Denkfehler ist.

Thema: Directory.CreateDirectory warten bis abgeschlossen
Am im Forum: Grundlagen von C#

Zitat
Gibt es eine Möglichkeit auf Beendigung der Verzeichniserstellung zu warten?
Nein, weil .NET hier keine Aktien im Spiel hat.
CreateDirectory (ist eine Methode, keine Funktion) ruft (auf Windows) die Win32 API ( CreateDirectoryA function (fileapi.h) - Win32 apps ) auf, die kein Warten anbietet.
Das Erstellen wiederum ist eine Metadata-Operation, was bedeutet, dass es "kurz" braucht, bis das Dateisystem das übernommen hat. Man kann sich das wie ein Commit vorstellen.
Daher ja: das von Dir festgestellte Verhalten ist bekannt und (aus Dateisystem-sicht) by design. Prinzipiell ist man auf keinem Datenträger davor geschützt; bei langsamen Datenträgern kommt das aber häufiger vor.

Dass die .NET Methode hier ein Info-Objekt zurück gibt, das hat nichts damit zutun.

Thema: Web Browser Aktualisiert sich nicht
Am im Forum: GUI: Windows-Forms

Wir hatten schon tausende Beiträge zum Webbrowser-Control. Dieses ist völlig veraltet und basiert im Standardfall auf dem IE7.
Alternativen sind seit vielen vielen Jahren https://github.com/cefsharp/CefSharp bzw. Microsoft Edge WebView2-Steuerelement - Microsoft Edge Development
Einfach mal 10 Sekunden die Forensuche verwenden ;-)

Zitat
So wie ich es aus deinem beitrag entnehme, muss ich wohl noch in c# Javascript implementieren?
Hättest du eventuell eine Hilfestellung zu diesem Thema.
Davon abgesehen, dass er das nich wirklich geschrieben hat, die Hilfestellung: Google Suche nach "c# webbrowser javascript"
Aber das brauchst Du alles nicht, wenn Du entsprechend CefSharp oder WebView2 verwendest. Beide Dokumentationen zeigen vollständig die Anwendung, auch mit JavaScript.

Thema: Templating mit Azure Functions
Am im Forum: Web-Technologien

Weil das ein Krampf ist, was Du da zusammen puzzlest, wenn man Dir das direkt sagen darf.
Directory.GetCurrentDirectory() ist in allen Aspekten der falsche Weg. Keine Ahnung, wie Du darauf kommst. Vermutlich irgendwo mit einem anderen Zusammenhang her kopiert?

Beachtest Du meine Beiträge dann kommt das bei raus:


RazorLightEngine engine = new RazorLightEngineBuilder()
    .SetOperatingAssembly(Assembly.GetExecutingAssembly())
    .UseFileSystemProject(executionContext.FunctionAppDirectory)
    .UseMemoryCachingProvider()
    .Build();

Damit hast Du das Setup für eine Datei-basierte Templating Pipeline. Keine Ahnung wieso Du immer noch UseEmbeddedResourcesProject verwendest. Doku gelesen, wofür das ist?
Beachtest Du dann die Dokumentation von RazorLight, was ich bei Deinem Code leider nicht annähernd erkennen kann, dann sieht das Rendering nur noch so aus:


TestViewModel vm = new TestViewModel();
string result = await engine.CompileRenderAsync("Views/Test.cshtml", vm);

Wie man sieht liegt die Test.cshtml in einem Views Projektordner, die dann noch für das Deployment entsprechend gesetzt sein muss.

  <ItemGroup>
    <Content Include="Views\Test.cshtml">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

Am Ende kommt eine vollfunktionale Azure Function mit RazorLight raus.


public class Function1
{
    [FunctionName("Function1")]
    public async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ExecutionContext executionContext)
    {
        RazorLightEngine engine = new RazorLightEngineBuilder()
            .SetOperatingAssembly(Assembly.GetExecutingAssembly())
            .UseFileSystemProject(executionContext.FunctionAppDirectory)
            .UseMemoryCachingProvider()
            .Build();

        TestViewModel vm = new TestViewModel();
        string result = await engine.CompileRenderAsync("Views/Test.cshtml", vm);

        return new OkObjectResult(result);
    }
}

Du musst eigentlich echt nur das machen, was in der Doku steht.
Du kannst fast alles 1:1 kopieren.

Thema: Multiple Views in einer anderen View (TabControl)
Am im Forum: GUI: WPF und XAML

Zitat von CoPyMaus
Ist es wirklich so Sinnbringend, das man besser nicht darauf verzichten sollte?
Mit Frameworks wie MVVMLight, Prism oder Caliburn hast Du die Chance Not-invented-here-Syndrom zu vermeiden.

Dein Ziel ist es ein Mini-Tool zu schreiben, das gewisse Aufgaben erledigen soll. Klar, Du kannst auch die nächsten Wochen damit verbringen das MVVM Light selbst nachzubauen; am Ende wirst dann mehr Zeit in die MVVM Implementierung stecken als in die Funktionalität Deines Minitools.

Hinweis, den Du wohl noch nicht von der MVVMLight Website entnommen hast:
MVVMLight ist eingestellt bzw. schon vor 2-3 Jahren in das Windows Community Toolkit übergegangen.
Introduction to the MVVM package - Windows Community Toolkit

PS: statt Newtonsoft.Json sollte man mittlerweile System.Text.Json verwenden.
Steht ebenfalls in der Doku :-)

Thema: Templating mit Azure Functions
Am im Forum: Web-Technologien

Siehe Dokumentation von RazorLight:

1) Templating Directory mit relativem! Pfad. Den bekommst Du über den Function Context.


string path = $"{ context.FunctionAppDirectory }/MyTemplates";
UseFilesystemProject(path)
context kommt dabei von ExecutionContext context als Function Parameter.
Prinzipiell kannst UseFilesystemProject auch weglassen und direkt den Pfad an der View anheften, dann musst die Engine nicht jedes mal erzeugen.

2) cshtml in Deine Assembly einbetten

Aber wenn ich Dein Code so anschau, dann hast den einfach (unüberlegt?) von der RazorLight QuickStart kopiert.
Wie schon bei Deinem anderen Thema: Les die Doku ganz. Dafür ist sie da. :-)

Thema: Multiple Views in einer anderen View (TabControl)
Am im Forum: GUI: WPF und XAML

Zitat von CoPyMaus
In ganz C# habe ich diesen Begriff bisher nicht gesehen. Hier wird doch eher von Fields, Members, Properties und Methoden gesprochen. Was jetzt genau was ist, steige ich so allmählich durch.
Dann scheinst bislang nicht ein mal in die Doku geschaut zu haben.
https://docs.microsoft.com/de-de/dotnet/csharp/tour-of-csharp/types bzw genauer Typen – C#-Programmierhandbuch
Wie Du siehst, gibt es in C# sehr wohl Variablen, sind dokumentiert und was anderes als Fields, Properties und Methoden.
Member wiederum ist nur ein Oberbegriff, siehe Member – C#-Programmierhandbuch

Ansonsten sind die Bezeichner von C# und Php relativ ähnlich, zumindest die der Grundkonstrukte
- Variablen => Variablen
- Eigenschaften => Eigenschaften und Felder (je nach Art)
- Methoden => Methoden
Zitat
Im Code-Behind habe ich derzeit lediglich zwei Methoden, weil ich dafür noch keine Alternativen gefunden habe.
Bin kein WPF Profi aber würde sagen, dass man das so nicht macht.
Vielleicht kann da ein WPF-Profi einen besseren Vorschlag machen.

Zumindest bei OnContentRendered bin ich mir relativ sicher, dass man sowas über einen Command löst.
[Artikel] MVVM und DataBinding
Zitat
Aber dafür weiß ich auch, was ich bisher in meinem Leben gemeistert habe
Werde die Aussage nicht bewerten, aber musst selbst wissen, wie viel Dir Deine Zeit Wert ist.
Hinter Fameworks wie MahApps stecken dutzende von Entwicklerjahre - von Profis.

Du kannst die nächsten Moante versuchen Deine Lösung zu finden, oder Du verwirfst das Not-invented-here-Syndrom und freust Dich, dass sich andere um eine Lösung gekümmert haben, die Du für Deine Zwecke adaptieren kannst.

PS: ja, verstehe Deinen Grund der langen Texte.
In Foren schreckt das jedoch die meisten Helfer ab.

Thema: Logging in Azure Function
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

RazorLight funktioniert einwandfrei in Functions; verwende ich auch.

PS: interessant, wie wir von Logging über Dependency Injection mittlerweile bei RazorLight angekommen sind, nur weil Du Deinen Code zu sehr verfremdelt hast.
Das kostet nicht nur Dich Zeit, sondern auch Helfern ;-)

Thema: Multiple Views in einer anderen View (TabControl)
Am im Forum: GUI: WPF und XAML

Zum Problem:
Das Erzeugen von Tabs im Code Behind ist eigentlich kein Non-Plus-Ultra, sondern verletzt eigentlich die Binding-Idee von WPF und MVVM.
Bedeutet: Du solltest primär den Binding Weg gehen und Code-Behind wenn möglich ganz weg lassen.

Bei Tabs hat i.d.R. jeder Tab sein eigenes ViewModel und entsprechende Inhalte.
Das Window selbst ist ebenfalls ein ViewModel, wie auch das Tab Control. Ergo: ein ViewModel kennt seine Child-ViewModels.

Hinweise zu Deinem Text:

Zitat
GUI = Visual Studio 2019 (up to date)
Visual Studio ist nicht die GUI, sondern Deine IDE.
GUI ist in diesem Fall WPF.
Zitat
ich möchte verhindern, zusätzliche Librarys zu verwenden .. [....]aber ich möchte es doch gleich richtig machen
Da hilft es Dir nicht, dass "Du halt so bist". Damit machst Du Dir selbst das Leben schwer und kannst gewisse Dinge ganz einfach nicht alleine stemmen, weil das gesamte moderne Ökosystem von Software - Java, NodeJS, .NET - darauf aufgebaut ist, dass externe Bibliotheken (meist Open Source) verwendet werden.
Die jeweiligen Frameworks bieten i.d.R. "nur Grundfunktionen". Pauschal daher externe Libs auszuschließen, ist eher unschlau; um es nett auszudrücken.
Im Zweifel kann man dann nur sagen: selbst schuld, pech gehabt.

Gerade im Bereich von WPF haben sich MVVM Frameworks oder Dinge wie Reactive Extensions oder MahApps etabliert.
Reactive Extensions zB. ist eines der größten Open Source Projekte und im Zusammenhang mit .NET sogar mittlerweile Teil der .NET Foundation.
Und diese Frameworks haben auch nichts mit "richtig" oder "falsch" machen zutun.

Falls Du Code-Vorlagen willst, so durchforste GitHub, ob Du was findest.


PS: ja Dein Text ist sehr lang, mit viel verwirrenden Stellen, die für das Problem keine Rolle spielen ;-)
Und Du hast evtl. die ein oder andere Ansicht, die Dir beim Schreiben von guter Software wahrscheinlich im Weg steht - gerade das Thema Dependencies.

Thema: Logging in Azure Function
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich hab mir kurz 2 Minuten Zeit genommen, hab das Standard Visual Studio Template genommen und ein Function Projekt angelegt.
Hab es konfiguriert, wie es in Verwenden der Abhängigkeitsinjektion in Azure Functions (.NET) beschrieben ist; hab Dein Code reinkopiert (und die Syntaxfehler beheben müssen...).


using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using MyNamespace;

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddTransient<IMyService, MeinService>();
        }
    }

    public interface IMyService
    {
        Task Do();
    }

    public class MeinService : IMyService
    {
        private readonly ILogger<MeinService> _logger;

        public MeinService(ILogger<MeinService> logger)
        {
            this._logger = logger;
        }

        public Task Do()
        {
            _logger.LogInformation("Test");
            return Task.CompletedTask;
        }

    }
}

namespace FunctionApp1
{
    public class Function1
    {
        private readonly IMyService _myService;
        private readonly ILogger<Function1> _log;

        public Function1(IMyService myService, ILogger<Function1> log)
        {
            _myService = myService;
            _log = log;
        }

        [FunctionName("Function1")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req)
        {
            _log.LogInformation("C# HTTP trigger function processed a request.");

            await _myService.Do();

            return new OkObjectResult("Works");
        }
    }
}


Anschließend Rechtsklick -> Publish -> Azure Function Linux -> Application Insights aktiviert.
Application Insights dann noch im Portal aktiviert. Fertig, funktioniert.

Das ist In Process, wie Du es hast - exakt nach Anleitung sowie das, was ich Dir hier schon in den Beiträgen gesagt hab.
Daher keine Ahnung, was Du machst.

Vermutlich hast irgendwas im Code, das Du uns hier nicht zeigen möchtest oder machst was, was Du hier nicht gesagt hast.

Thema: Logging in Azure Function
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von Hqrtz
Gibt es eine andere runtime version die ich probieren kann?
Jo, an der Stelle das vierte Mal der Hinweis auf Isolated Process.
Link weiterhin im ersten Beitrag ;-)
Zitat
Hier ist genau das selbe Problem
Offenbar nicht, denn der Issue-Ersteller schreibt selbst, dass es an seiner Auth-Implementierung lag und nicht am DI.

Dazu der Hinweis im zweiten Issue
Zitat
Some of those issues are known limitations of the product at the moment. We are working on first class support for customer facing DI capabilities in Azure Functions, which will come with a full set of documentation, including services you can depend on and official guidance.
.. und mein Hinweis im ersten Beitrag:
Zitat von Abt
Dem Code nach verwendest Du noch die bereits (nach .NET 6) abgekündigte In Process Variante der Functions, die nur eine abgespeckte Variante der Dependency Injection unterstützt.

Thema: Logging in Azure Function
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Publishen hat mit Dependency Injection nichts zutun.
Dass nen neues Projekt funktioniert, da spricht es dafür, dass Deine Pakete nicht aktuell sind oder was anderes krum ist, zB. Runtime Version.

Thema: Logging in Azure Function
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Dann kommt das entweder vom verfremdeln Deines Codes, was mein Missverständnis auslöst, oder Du hast ein ganz kurioses Klassen/Namespace Design...


// Dieser Zeile nach befinde sich die Startup Class im Function Namespace
[assembly: FunctionsStartup(typeof(Function.Startup))]

=> Function.Startup
public class Startup : FunctionsStartup

// Die Function hat aber gleichzeitig den Klassenname Function
public class Function

Thema: Logging in Azure Function
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Du verfremdelst Deinen Code ein bisschen zu sehr, wenn ich Dir das sagen darf.
Dein Code kann niemals funktionieren, weil offenbar laut dem Beispielcode hier Dein Namespace und Deine Function beides Function heissen - das kann nicht sein.
Kannst bitte Dein Code nicht ganz so sehr verfremdeln, oder zumindest sinnvoller?

Rein von der Registrierung hier sehe ich keinen Fehler. Das Transient vs. Scoped macht hier keinen Unterschied.
Sind Deine NuGet Pakete auch wirklich aktuell und bist auch auf der aktuellen Function Runtime?

Hat Dein MainService noch irgendwelche Abhängigkeiten, die nicht aufgelöst werden können?

Zitat
Ok ich denke ich werde mit den Isolated Process nochmal angucken.
Solltest tun, macht vieles einfacher.

Thema: Welche Datenbank nehmen?
Am im Forum: Datentechnologien

Du kannst Sqlite so verwenden, dass Daten auf die Disk geschrieben werden (local file) oder aber nur im Speicher gehalten werden (in memory).
Ersteres ist persistentes Speichern, zweites zB. nur für Caching oder Tests - Daten gehen verloren, sobald der Prozess zuende ist.

Thema: Welche Datenbank nehmen?
Am im Forum: Datentechnologien

Zitat von sven007
Im Moment liegen die Daten halt im Access, daher war das naheliegend. Von SQLite habe ich gelesen, aber das bring mir ja nichts bei parallelen Zugriffen.
Access erst recht nicht, weil mit einer sehr hohen Wahrscheinlichkeit die Access Datei bei parallelen Zugriffen kaputt geht.

SQLite unterstützt parallele Reads, aber keine parallelen Prozess-übergreifenden Writes (weil das eben auf das Dateisystem erfolgt und der Mittelsmann aka DB Server für ein Locking fehlt).
Ebenso ist ein Read nicht möglich, wenn ein Write erfolgt. Das Stichwort ist hier Rollback Journal Mode, siehe SQlite Doku unter Locking.
Das übernimmt aber der Treiber für Dich.

Willst Du echte parallele Writes, dann geht das nur über einen Datenbankserver (wobei auch jeder ACID-konforme DB Server entsprechend bei Writes lockt).



Thema: async Task<bool>
Am im Forum: Grundlagen von C#

Das doofe ist, dass Dein Try and Error Vorgehen hier nicht helfen wird.
async/await ist leider ein Konzept, das man verstehen muss. Sonst wendet man es - wie hier - in 99% der Fälle falsch an.

Du musst auch nicht die Schleife asynchron auslagern, sondern das GetProcesses.


private static Task<Process[]> InternalGetProcessesAsync()
    => Task.Run(Process.GetProcesses);
Das kannst Du dann vor dem Schleifenzugriff asynchron aufrufen.

Aber wie gesagt: schau Dir ein Tutorial von async/await an, versuch es zu verstehen.
Ansonsten zeigt die Vergangenheit, dass in der Regel Murks bei raus kommt.

Thema: Logging in Azure Function
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

In meinen Augen machst Du Dir das Leben selbst schwer, aber musst selbst wissen.

Verwende einfach die Isolated Process Variante, registrier Dein Serilog, setz Application Insights direkt als Sink -> fertig.
Ich verwend das seit dem ersten Tag der Isolated Process Möglichkeit in hunderten von Functions, super einfach und endlich muss man die Besonderheiten der Function nicht mehr beachten.
Musst für Serilog 2 Pakete einbinden, die Config setzen und eine Zeile Code einfügen.

Mit ILogger hat das nichts zutun, denn ILogger ist nur das Logging Interface, das eigentlich alle Logging Implementierungen verwenden. Das Kernstück hierzu ist die LoggerFactory.
Willst Du Serilog nicht nutzen - warum auch immer - dann kannst entweder das AI SDK selbst implementieren oder eben direkt auf die Console schreiben, das dann wieder im AI Log landet, weil das die Runtime automatisch macht, wenn die Umgebungsvariable gesetzt ist - alles soweit in meinem ersten Beitrag erwähnt.

Zitat von Hqrtz
Wenn ich das richtig verstehe ist das dann so richtig wie ich das gemacht habe nur es wird nicht in der Konsole angezeigt aber in ApplicationInsights wenn ich die Variable dafür setze?
Ja und nein, verwendest halt noch den alten Krams. Da Du aber ohnehin ne Function mit DI und Co verwendest liegt es eigentliche nahe, dass man eben nicht mehr In Process sondern Isolated Process verwendet, weil Du dann nichts extra umbauen musst, was die Function Runtime so will. Musst halt selbst abwägen.
Wenn Du das so weiter machen willst, dann fehlt - soweit ich das sehe - nur die Umgebungsvariable.
Zitat von Hqrtz
Würde ungern die Architektur jetzt ändern, nur um Logging anders / besser nutzen zu können.
Langfristig wirst Du das so oder so müssen, weil - wie bereits gesagt - In Process abgekündigt ist.
.NET 6 wird die letzte Runtime-Version sein, die das unterstützt. Siehe Link.
Zitat von Hqrtz
Serilog habe ich bisher nicht genommen, weil ich eig nur Loggen möchte welche Methode aufgerufen wird und das sollte ja auch mit dem ILogger gehen
ILogger ist ein Interface, das Serilog genauso nutzt. ILogger allein loggt gar nichts.
Getauscht wird nur die Implementierung, die Standardmäßig der Default Output ist, was wiederum die nackte Console über den TraceWriter ist.
Wenn Du Serilog registrierst, dann kannst verschiedene Sinks angeben und genauso loggen. Keinerlei Unterschied zur Architektur, aber zum Logging.
Glaub Du hast das Konzept dahinter noch nicht 100% verstanden, oder?