Ein gutes Tutorial mit dem Titel "Einführung in das Programmieren mit C#" findet sich hier:
http://www.uni-trier.de/fileadmin/urt/doku/csharp/v40/csharp4.pdf
Geeignet zum Lernen und Vertiefen.
Du hast offenbar ein Projekt mit vorkompilierten Headern gemacht. Wenn du nicht weißt, was das ist, solltest du es halt beim Erstellen des Projektes auch nicht anwählen; Microsoft kann da gar nichts dafür. Mach am besten ein neues Projekt und diesmal ohne Precompiled Headers...
@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.
Nun noch eine Erkenntnis...
Unter Windows 10 (im Normal-Modus - im abgesicherten Modus funktioniert es) kommt bei der Ausgabe auf ein USB-Laufwerk konstant ein Fehler
~~~~~~~~~~~~~~~~~~< USB-Laufwerk ausgeben >~~~~~~~~~~~~~~~~~~
USB-Laufwerk "\\.\PhysicalDrive7" wird erstellt.
Fehler <catch> beim Schreiben <Write> des USB-Laufwerkes "\\.\PhysicalDrive7"
~~~~~~~~~~~~~~~~<Exception-Anfang>~~~~~~~~~~~~~~~~~~~~~~
System.UnauthorizedAccessException: Der Zugriff auf den Pfad wurde verweigert.
bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
bei System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count)
bei System.IO.FileStream.Write(Byte[] array, Int32 offset, Int32 count)
bei HkDiskette.Form1.UsbAusgeben()
~~~~~~~~~~~~~~~~~<Exception-Ende>~~~~~~~~~~~~~~~~~~~~~~~
Unter Windows 11 fuktioniert alles ohne Fehler.
Wenn ich nun unter Windows 10 VMWare Workstation 17 Player starte und dort Windows 7 Ultimate X64 und unter diesem Windows 7 mein Programm, dann klappt ebenfalls alles ohne Fehler.
Die USB-Laufwerke werden vom VMWare Player exclusiv der VM zugeordnet, so dass das übergeordnete Windows 10 sich offenbar nicht mehr darum kümmert. Bei Windows 7 läuft Microsoft Security Essentials als Virenschutz.
Es ist eben immer gut, wenn man mehrere Möglichkeiten hat.
Andererseits kann Rufus problemlos auch unter Windows 10 einen USB-Stick aus einer VHD- oder IMG-Datei erstellen.
Wie macht das Programm das ? Bei RUFUS steht, dass er das mit C++ programmiert hat.
Da gibt es evtl. weiter Möglichkeiten, sich die Berechtigung für das Schreiben zu holen.
Bei RUFUS läuft ja der gleiche Win10-Virenschutz-Defender.
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
@hkdd https://www.microsoft.com/en-us/wdsi/filesubmission/ hätte ich noch gefunden. Da sollte man sich entsprechend als "Home user" auch mit einem privaten Account anmelden können.
Virus Total gibt dir auch aus, welche Hersteller ein Virus melden. Bei denen kann man i.d.R. auch False Positives melden.
@hkdd sagte in DivRem in BigInteger nicht vorhanden:
Jetzt habe ich new entfernt, damit klappt es.
Hast du auch eine Frage? Ist die Frage warum das "new" da nicht hingehört?
Falls ja, "DivRem" ist eine statische Methode und keine innere Klasse von BigInteger.