Ne mögliche alternative wäre, wenn die "generatoren" kein generisches Tree<T>/List<T> erzeugen würden sondern eine instanz einer Klasse die dann von Tree<T>/List<T> abgeleitet ist.
Dann wären die namen sprechender.
z.b.
class ConfigurationAsTree : Tree<string>
{}
@hustbaer: Schau dir mein zweites Beispiel an. Dies benutze ich selber in meinen eigenen Projekten sehr oft, damit ich für Zugriff auf die Sub-Namespaces nicht immer wieder den eigenen Main-Namespace angeben muß.
Afaik verwenden aber die Code-Generatoren immer die erste Schreibweise mit voll ausgeschriebenen Namespace.
Eigene Delegate-Typen braucht man i.d.R. nicht mehr definieren, sondern kann die Generics Action<...>, Func<R, ...> bzw. EventHandler<EventArgs> benutzen.
Nope: long ist ein System.Int64
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/integral-numeric-types
C# type/keyword Range Size .NET type
long -9,223,372,036,854,775,808 Signed 64-bit integer System.Int64
to 9,223,372,036,854,775,807
@Smitty sagte in Zugriff auf Textdatei in der Projektliste:
Ganz einfach:
die Textdatei in die Projektmappe aufnehmen, auf die Ebene der .cs Dateien
dann sowas hier:
...
DANN ist die Textdatei ja auch da, nämlich in Deiner Anwendung! Allerdings statisch ...
... dann gibst Du Deine Anwendung weiter und aktualisierst zu Hause auf Deinem System die Textdatei.
Und nun soll die weitergegebene Anwendung erkennen, dass bei Dir zu Hause die Textdatei aktualisiert wurde ...
Und deshalb:
Leider erkennt der Compiler nicht wenn das txtFile aktualisiert wurde, hier hilft dann einmal neu erstellen.
Thats all
@micha7 War in der Nacht schon zu müde. Wenn ich Dir
@Swordfish sagte in Externe Anwendung starten und Fenster minimieren:
https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.createnowindow?view=netcore-3.1
?
hinwerfe und Du darauf sagst daß Du das schon versucht hast dann gehe ich schon davon aus, daß Du den Beispielcode liest und genauso umsetzt wie im Beispiel angegeben. Von Deiner Aussage
@micha7 sagte in Externe Anwendung starten und Fenster minimieren:
startInfo.CreateNoWindow = true;
Das hatte ich schon ausprobiert, aber es zeigt keine Wirkung. Es werden trotzdem beide Fenster erzeugt.
kann man im Leben nicht darauf kommen, daß StartInfo.UseShellExecute nicht false gesetzt wurde. Auch empfand ich ehrlich gesagt
@micha7 sagte in Externe Anwendung starten und Fenster minimieren:
@Swordfish Wenn ich alles hinschreiben würde was ich schon ausprobiert habe und was nicht funktioniert hat, dann wäre der Text so lang dass du's nicht lesen würdest.
ziemlich daneben, denn entweder interessiert einen Leser etwas und er liest es oder er lässt es bleiben. Aber es gehört zum guten Ton bei einer Bitte um Hilfe zu erwähnen was schon versucht worden ist. Je vollständiger und präziser desto gut - das spart zeit- und nervenraubende Nachfragen. Bei der Kommunikation über solche Themen ist Präzision unbedingt notwendig.
Schreibe bitte in eine Zeile vor deinem Code ```csharp und in eine Zeile nach Deinem Code ```. Alternativ markiere Deinen Code, wähle in dem Drop-down in der Toolbar über dem Textfenster "C#" aus und klicke auf den </>-Button rechts daneben.
Du kannst Deine Beiträge auch nachträglich bearbeiten. Den Menüpunkt "Bearbeiten" findest Du hinter dem Drei-Punkte-Menü rechts unter Deinem Beitrag.
Topic: Wenn das Ding immer global erreichbar und immer dasselbe ist ... wofür dann überhaupt ein Parameter dafür??
@Waly sagte in Möglich eigenständige C# (oder c++) Files zu kompilieren, damit man den Source nicht weitergeben muss:
ist es möglich eigenständige C# (oder c++) CS Files zu kompilieren, damit man den Source nicht weitergeben muss?
C# hat @Th69 ja schon beantwortet.
Bei C++ gibt es statische und dynamische Bibliotheken.
Kann man c# oder C++ auch in andern VS Projekten hinzufügen? So wie es bei Dephi möglich ist. PAS > DCU
C++ Source Files kann man immer mit C Source Files mischen. Sonst aber nichts.
C# Source Files kann man gar nicht mischen soweit ich weiss.
Wenn du aber eine Assembly (C#) bzw. Bibliothek (C++) erstellt hast, dann kann man das schon mischen. Die mit C# erstellte Assembly kannst du in allen .NET Sprachen verwenden. Und die mit C++ erstellte DLL kannst du quasi überall verwenden, vorausgesetzt du beschränkst dich auf ein reines C Interface.
Hab noch etwas gegoogelt. Um die schwarze Magie zu verwenden müsstest du hier Expression<Action<T>> als Parameter nehmen statt des Delegates. Das blöde dabei ist nur: um das Ding dann auszuführen müsstest du es runtime compilieren. Was zu Garbage und schlechter Performance führt.
=> Vermutlich nicht so gut.
Bessere Variante kenne ich nicht. Heisst aber nicht dass es keine gibt, ich bin was C# angeht nicht mehr wirklich auf dem Laufenden.
@DocShoe Ja das sieht wesentlich besser aus als mein Vorschlag
Ist trotzdem nicht schön, da alle Informationen schon zur Compile Time zur Verfügung stehen.
Eh. Aber das ist halt der Unterschied zwischen Generics und Templates. Über "T" ist im Generic nur das bekannt was als Constraint mitgegeben wurde. Hier also dass es ne "class" ist und dass diese einen Default-Konstruktor hat.
Es gibt wie vermutet eine technische Lösung, und sie heisst "depency injection" (DI).
Genauer beschrieben wird sie hier in den MS Docs:
Environment-based startup class and methods
Die Unterscheidung "development | production" (oder mehr wie z.B. "staging") wird in Visual Studio 2019 als String hinterlegt in "Projekteigenschaften / Debug / Environment variables":
Name
ASPNETCORE_ENVIRONMENT
Value
Development
Sowohl in der "startup.cs" der Azure App als auch den Azure App Pages "*.cshtml.cs" werden diese Namensräume hinzugefügt:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
Allen Methoden der "startup.cs" kann das "IWebHostEnvironment" Interface hinzugefügt werden:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsProduction())
{
// do something
}
else if (env.IsDevelopment())
{
// do something
}
}
Die Model-Klasse einer Page (bei mir "class IndexModel : PageModel") bekommt eine neue Eigenschaft:
private readonly IWebHostEnvironment Env;
und dessen Konstruktur einen neuen Parameter:
public IndexModel(IWebHostEnvironment env)
{
this.Env = env;
}
So erhält auch die Page die Umgebungsvariable.
Mit DI werden auch andere Objekte weitergereicht innerhalb einer Azure App, z.B. die "appsettings.json".
Hoppelmoppel
Wenn es nur unterschiedliche Vektoren sind, aber ansonsten alles gleich, kann man die Implementierung ja einfach als Template machen:
HRESULT query_something(WrappedSomething** result)
{
return query_impl(result, [WrappedSomething& r](){ r.data = query_something(); });
}
@Th69, ja, das war eine Frage.
Dank Euerer Hinweise und Links habe ich Antworten gefunden
0x0132 Exif.Image.DateTime
Datum und Uhrzeit der Bilderstellung.
Im Exif-Standard ist dies das Datum und die Uhrzeit,
zu der die Datei geändert wurde.
0x9003 Exif.Image.DateTimeOriginal
Datum und Uhrzeit der Generierung der Originalbilddaten.
Bei einer digitalen Fotokamera werden Datum und Uhrzeit der Bildaufnahme aufgezeichnet.
0x9004 Exif.Photo.DateTimeDigitized
Datum und Uhrzeit der Speicherung des Bildes als digitale Daten.
0x9290 Exif.Photo.SubSecTime Millisekunden für 0x0132 Exif.Image.DateTime
0x9291 Exif.Photo.SubSecTimeOriginal Millisekunden für 0x9003 Exif.Image.DateTimeOriginal
0x9292 Exif.Photo.SubSecTimeDigitized Millisekunden für 0x9004 Exif.Photo.DateTimeDigitized
0x0132 gibt es nicht bei allen Kameras. Hier ist u.U. ein abweichender Inhalt zu finden, wenn der Knipser mit Funktionen der Kamera, die nicht jede Kamera anbietet, an dem Bild etwas bearbeitet hat.
0x9003 könnte der Zeitpunkt sein, zu dem das Bild auf dem Chip aufgezeichnet wurde.
0x9004 ist wahrscheinlich der Zeitpunkt zu dem das Bild auf die Speicherkarte übertragen wurde.
0x9003 und 0x9004 sind = Aufnahmedatum und -Uhrzeit
0x0132 kann abweichen, wenn mit der Kamera nach der Aufnahme an dem Bild Änderungen vorgenommen wurden.
@Th69 Da habe ich wohl nicht weit genug nach unten gescrollt....habe mir aber ein Lesezeichen gesetzt, um das auszuprobieren! Danke nochmals
Liebe Grüße
Uwe Homm
Ich habe es jetzt herausgefunden wie das geht:
Program.cs
using System;
using System.Windows.Forms;
namespace test
{
static class Program
{
/// <summary>
/// Der Haupteinstiegspunkt für die Anwendung.
/// </summary>
[STAThread]
static void Main(string[] args) // Diese Zeile muss modifiziert werden
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1(args)); // Diese Zeile muss modifiziert werden
}
}
}
Form1.cs
using System;
using System.Windows.Forms;
namespace test
{
public partial class Form1 : Form
{
string[] arguments;
public Form1(string[] args)
{
InitializeComponent();
arguments = args;
}
private void Form1_Shown(object sender, EventArgs e)
{
foreach (string s in arguments)
richTextBox1.AppendText(s + "\n");
}
}
}