Zwei Programme sollen möglichst bald per Fernwartung bearbeitet werden.
Falls weitergehendes Interesse besteht, dies:
Für eine Reihe von Programmen sind Updates zu erstellen.
Einige bringen beim Kompilieren auch Fehler.
Die vorhandenen können auch als Lernobjekte genutzt werden, sofern diese beiden einwandfrei laufen, Entlohnung nach Absprache.
Könner bekommen gerne 40,00 € / Stunde. Spitzenpersonen nach Absprache auch 80,00 oder mehr.
hmm.. würde ich die ganze funktion einfach in einem neuen Thread wrappen
Task.Wait(new Task(()=> meinFunc());
wäre es besser, das Callback wird allerdings immer im UI Thread bearbeitet, das macht die API darunter so..
Hallo,
@DirkB hatte den richtigen Gedanken. Ich habe natürlich "nur" eine spanische Tastatur eingestellt, die Windows-Anzeige-Sprache aber nicht geändert. Das habe ich nun nachgeholt und siehe da, es erscheint ein <Ctrl> im Dateimenu.
War also doch eine doofe Frage meinerseits
Vielen Dank für eure Hilfe und ein schönes Wochenende noch.
VG Torsten
@hkdd So beim groben Überfliegen scheinen das doch schon sehr spezielle Probleme zu sein, mit denen du da kämpfst. Ohne dein Setup zu reproduzieren (schon etwas mehr als nur einmal den Compiler anzuwerfen und daher aufwändiger) wird es wohl nur bei sehr offensichtlichen Dingen jemanden geben, der dir nur vom Quellcode-Lesen her helfen kann.
Dennoch gut, dass du deine Erkenntnisse hier dokumentierst. Vielleicht hilft das ja irgendwann mal jemandem weiter
@hustbaer ,
ich habe auf meinem Laptop, auf dem auch Win10 und 11 parallel installiert sind, in der Win10 Registry gesucht, da steht sogar beim normalen Eintrag
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
bei ProductName: "Windows 10 Enterprise"
auch bei CompositionEditionID steht => Enterprise statt Pro
Und bei WOV6432Node steht auch überall Enterprise.
Wenn ich SystemInfo aufrufe, wird korrekt Windows 10 Pro angezeigt. Ach bei WinVer ist alles korrekt.
Hallo,
ich versuche meine Unittests auf der Kommandozeile mittels MSBuild.exe auszuführen und scheitere kläglich. Das Netz ist sonst voll von Tutorials, aber in diesem Fall ist es nicht so pralle.
Was ich gefunden habe, ist folgende Projektdatei, die ich schon mal soweit auf mein Projekt angepasst habe:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="KernelTest" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask AssemblyFile=".\packages\MSTest.TestFramework.2.1.2\lib\uap10.0\Microsoft.VisualStudio.TestPlatform.TestFramework.dll" TaskName="Runner.MSBuild"/>
<Target Name="KernelTest">
<ItemGroup>
<SolutionToBuild Include="cSharpLibraries.sln"/>
<TestContainer Include=".\KernelTests\bin\Debug\KernelTests.dll"/>
</ItemGroup>
<MSBuild Projects="@(SolutionToBuild)"/>
</Target>
</Project>
Wenn ich MSBuild nun ausführe, bekomme ich folgende Fehlermeldung:
cSharpLibraries.test.csproj(9,3): error MSB4062: Die Runner.MSBuild-Aufgabe konnte nicht aus der ???\cSharpLibraries\.\packages\MSTest.TestFramework.2.1.2\lib\uap10.0\Microsoft.VisualStudi
o.TestPlatform.TestFramework.dll-Assembly geladen werden. Stellen Sie sicher, dass die <UsingTask>-Deklaration korrekt ist, die Assembly und alle zugehörigen Abhängigkeiten verfügbar sind und die Aufgabe eine öffentliche Klasse enthält
, die Microsoft.Build.Framework.ITask implementiert.
Hat jemand eine Idee?
Vielen Dank im Voraus
VG Torsten
Hi,
ich möchte die folgende Schleife als "CodeIterationStatement" abbilden.
int i = 0;
int j = 0;
for (i = 0; ((i < 10) && (j < 10)); ++i, ++j)
{
}
Allerdings unterstützt das "IncrementStatement" Property nur ein einzelnes "CodeStatement" anstatt einer Liste. In C++ ließen sich die beiden "++i" bzw. "j++" als "CodeBinaryOperatorExpression" abbilden mittles des Komma-Operators. Diesen gibt es unter C# aber nicht. Wie also lässt sich obiges Konstrukt in C# mittels der Klassen im CodeDom-Namespace abbilden? Jemand eine Idee?
https://learn.microsoft.com/de-de/dotnet/api/system.codedom?view=dotnet-plat-ext-7.0
PS: Es gibt zwar eine "CodeStatementCollection" aber diese ist nicht von der "CodeStatment"-Klasse abgeleitet. Lässt sich so also auch nicht (direkt) zuweisen.
PPS: Witzigerweise hat die ForStatementSyntax-Klasse aus dem CodeAnalysis Namespace eine Liste von Incrementoren wie man es erwarten würde (https://learn.microsoft.com/en-us/dotnet/api/microsoft.codeanalysis.csharp.syntax.forstatementsyntax.incrementors?view=roslyn-dotnet-4.3.0)
@hkdd sagte in Zeitstempel in Directorys und Dateien setzen:
Da der XP-Explorer offenbar keine Zeitumrechnungen macht und die Zeit so anzeigt, wie sie gespeichert ist (analog DIR), sind die gespeicherten Zeiten alle um eine Stunde nach vorn gesetzt
Nein, das stimmt nicht. Auch der Windows-XP Explorer macht ne Umrechnung. Und zwar von UTC nach lokaler Zeit. Er macht sie nur falsch.
@DocShoe sagte in Konsolen-Ausgaben unter Windows 7 und 8.1 (Encoding):
Wie startest du denn den Programm?
Jetzt habe ich es gefunden - das wusste ich eigentlich schon von einem anderen Programm, habe aber nicht gleich daran gedacht.....
CHCP 65001 - ist die eine Sache.
ABER => man muss im CMD-Fenster bei WIndows 7 und 8.1 die Schriftart auf eine umstellen, die auch UTF8 darstellen kann.
Voreingestellt ist = Rasterschriftart.
Das muss man ändern in => Lucia Console
Mein kleines Testprogramm sieht jetzt so aus und funktioniert:
using System;
using System.Reflection;
using System.Text;
using System.Management;
namespace ConsoleNET472Vm81
{
internal class Program
{
public static int WinVer = 0; //Windows-Version = 7, 81, 10, 11 oder 0 = nicht erkannt
static void Main(string[] args)
{
WinVer = GetOperatingSystem(); //Windows-Version = 7, 81, 10, 11 oder 0 = nicht erkannt
string Text =
"Fröhliches Ostern\n" +
"auf der grünen Wiese\n" +
"Eintritt: 5,00 €\n" +
"x²+y² = z²\n" +
"2³ = 8\n"+
"äöüß AÖÜ € @ °";
if ((WinVer == 10) || (WinVer == 11))
{
Console.OutputEncoding = Encoding.Default;
Console.InputEncoding = Encoding.Default;
}
Console.WriteLine(Text);
Console.ReadLine();
} // Main
//===================================================================
// Ermitteln, unter welchem Windows das Programm läuft
//===================================================================
static int GetOperatingSystem()
{
ManagementScope scope = new ManagementScope("root\\CIMV2");
SelectQuery query = new SelectQuery("Win32_OperatingSystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
foreach (ManagementObject item in searcher.Get())
{
string sCaption = (string)item.Properties["Caption"].Value; // Operating System
if (sCaption.Contains("Microsoft Windows 11")) return 11;
if (sCaption.Contains("Microsoft Windows 10")) return 10;
if (sCaption.Contains("Microsoft Windows 8.1")) return 81;
if (sCaption.Contains("Microsoft Windows 7")) return 7;
}
return 0; // kein Windows 7, 8.1, 10 oder 11 gefunden
} // GetOperatingSystem()
}
}
Und schon können UTF8-Zeichen, wie das €-Zeichen angezeigt werden.
Auch unter Windows 7 klappt es...
Link Text
So genau habe ich mich damit auch noch nicht beschäftigt.
Auf die Schnelle habe ich aber folgende Links gefunden:
C++ – Obtain a list of partitions on Windows
C++ method for Diskpart list disk
drive.c (Code für USB-Zugriff)
Edit:
In How to list physical disks? stehen auch einige Möglichkeiten (besonders Zugriff auf "\\.\PhysicalDriveX" sowie mittels Registry in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\disk\Enum).
@Finnegan
TOLL - das ist die Lösung, ich habe noch die Abfrage auf PageUp und PageDown ergänzen müssen. Right und Left spielt bei mir keine Rolle, kann aber nicht schaden
//=============================================
// Ausgabe von Tonsignal unterbinden
//=============================================
private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
if (richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart) == 0 && e.KeyData == Keys.Up ||
richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart) == richTextBox1.GetLineFromCharIndex(richTextBox1.TextLength) && e.KeyData == Keys.Down ||
richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart) == 0 && e.KeyData == Keys.PageUp ||
richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart) == richTextBox1.GetLineFromCharIndex(richTextBox1.TextLength) && e.KeyData == Keys.PageDown ||
richTextBox1.SelectionStart == richTextBox1.TextLength && e.KeyData == Keys.Right ||
richTextBox1.SelectionStart == 0 && e.KeyData == Keys.Left
)
e.Handled = true;
} // richTextBox1_KeyDown
Es geht aber noch einfacher, wenn man diesen Warnton generell nicht haben will, dann kann man die IF-Abfrage weglassen.
//=============================================
// Ausgabe von Tonsignal unterbinden
//=============================================
private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
}
Nochmals DANKE für diesen Hinweis.
@firefly
Link Text
Es geht ja auch etwas um das Anzeigefenster, die Mail-Adressen sind breiter, als die Telefonnummern.
Ich werde in die Überschrift SIP/URI/Mail-Adresse schreiben. Dann ist hoffentlich alles klar.
PS: Du bist ja auch ein Frühaufsteher.
Hello this is Gulshan Negi
Well, ensure that the file is saved as an XML file and not in a different format such as a text file or word document.
Hope it will work.
Thanks
Guten Morgen,
ich möchte jegliche Art von Daten (string/byte[]) speichern, und zwar so, dass diese mit in der dll kompiliert wird.
Meine Ist was grob folgendes (pseudo):
[MyRessourceAttribute(type: "xml")]
class MyResourceX
{
private string _base64Content =".......";
public string AsString() => BitConverter.ToString(Convert.FromBase64String(_base64Content ));
public byte[] AsBytes() => Convert.FromBase64String (_base64Content );
}
Die klass wird dann via roslyn o.ä. erstellt,
Nun frage ich mich hab ihr vll. ne bessere , performantere idee, daten driekt in ner assembly zuspeichern und abzurufen!?
Ich denke schon dass ich verstehe was du machen willst.
Nur nicht wieso du meinst da dynamic oder Casts zu brauchen.
Das Setzen der Werte wird wohl meist über Strings passieren - Kommandozeile, Configfile - das ist ja alles textbasiert. Und beim Lesen wirst du die Objekte ja nicht per Name nachschlagen müssen. D.h. dort kannst du direkt auf die abgeleitete Klasse zugreifen.
public interface IParameterBase
{
string Name { get; }
string Description { get; }
string DefaultValueString { get; }
string ValueString { get; set; }
void ResetToDefault();
}
public interface IParameter<T> : IParameterBase
{
T Value { get; set; }
}
public class IntParameter : IParameter<int>
{
public string Name { get; private set; }
public string Description { get; private set; }
public string DefaultValueString
{
get { return m_defaultValue.ToString(); }
}
public string ValueString
{
get { return m_value.ToString(); }
set { m_value = int.Parse(value); }
}
public int Value
{
get { return m_value; }
set { m_value = value; }
}
public IntParameter(string name, string description, int defaultValue)
{
Name = name;
Description = description;
m_defaultValue = defaultValue;
m_value = defaultValue;
}
public void ResetToDefault()
{
m_value = m_defaultValue;
}
private int m_defaultValue;
private int m_value;
}
public class StringParameter : IParameter<string>
{
public string Name { get; private set; }
public string Description { get; private set; }
public string DefaultValueString
{
get { return m_defaultValue; }
}
public string ValueString
{
get { return m_value; }
set { m_value = value; }
}
public string Value
{
get { return m_value; }
set { m_value = value; }
}
public StringParameter(string name, string description, string defaultValue)
{
Name = name;
Description = description;
m_defaultValue = defaultValue;
m_value = defaultValue;
}
public void ResetToDefault()
{
m_value = m_defaultValue;
}
private string m_defaultValue;
private string m_value;
}
public class MyParameters
{
public IntParameter FooCount { get; private set; }
public StringParameter BarPath { get; private set; }
public MyParameters()
{
FooCount = Add(new IntParameter("foo_count", "Initial number of foo instances", 3));
BarPath = Add(new StringParameter("bar", "Path of the bar directory", "C:\\Bar"));
}
public void SetValue(string name, string value)
{
m_parameters[name].ValueString = value;
}
// if necessary:
public IParameter<T> Get<T>(string name)
{
// yes, this is a cast, but only in one central place.
// and I don't think this function would be needed often - if at all.
return (IParameter<T>)m_parameters[name];
}
private T Add<T>(T p) where T : IParameterBase
{
m_parameters.Add(p.Name, p);
return p;
}
private readonly Dictionary<string, IParameterBase> m_parameters = new Dictionary<string, IParameterBase>();
}
class Usage
{
public static void Example(MyParameters param)
{
param.SetValue("foo_count", "123"); // use string API to set value from cmdline/config-file
int i = param.FooCount.Value; // get value by accessing object directly
}
}
Du musst für den Zugriff immer Deine Credentials angeben. Du musst eben nur auf ein anderes Konto Zugreifen.
Exchange regelt das, ob Du es darfst oder nicht.
@hustbaer sagte in Warum klappt Binary bei mir nicht:
spielt ja der File-Cache immer mit rei
Das habe ich mir ja auch gedacht, deshalb habe ich jeweils zweimal das Programm laufen lassen.
Beim Delphi-Programm war der zweite Lauf schneller (warmer Cache).
Beim C# Programm war er allerdings langsamer, als der erste ( überhitzter Cache ??? )
Die Klammern sind normale Block-Klammern, wie bei anderen Anweisungen auch (if, for, while), d.h. bei nur einer folgenden Anweisung können diese entfallen.
Ab C# 8 können sogar die using-Anweisungen ohne Verschachtelung geschrieben werden (und gelten dann bis zum Ende des Blocks, in dem sie sich selbst befinden): using-Deklaration (es entfallen zur Syntaxerkennung dann die runden Klammern).
using var file1 = new FileStream(fileName1, FileMode.Open);
using var file2 = new FileStream(fileName2, FileMode.Open);
// keine Blockklammern mehr nötig