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 Pulpapex
Thema: Assemblercode in C# einbinden
Am im Forum: Rund um die Programmierung

Wie soll das denn gehen, nativen Assemblercode? Oder meinst du IL-Code? Selbst den kann man nicht direkt in eine C# Quellcode-Datei schreiben. Du kannst aber IL Quellcode mit ilasm.exe compilieren.

Thema: Diskussion zu "Message Send"
Am im Forum: GUI: Windows-Forms

Hmm, das ist natürlich blöd.

Es gibt noch die CreateNoWindow-Eigenschaft in ProcessStartInfo. Die gibt an, ob ein Prozess in einem neuen Fenster gestartet werden soll. Bloss ich weiss nicht, ob dann die Umleitung noch funktioniert.

Ansonsten könnte man versuchen, das Fenster aus dem Desktopbereich rauszuschieben. Leider gibt es dafür keine Methode, sondern nur das Fenster-Handle. Man müsste es also über die WinApi machen.

public class WinApi {
    [DllImport(>user32>)]
    public static extern  bool SetWindowPos(int hwnd, int hwndInsertAfter, int x, int y, int h, int w, uint flags);
}
Für den hwnd-Parameter muss man folgenden Wert angeben.

int hwnd = process.MainWindowHandle.ToInt32();
Mit hwndInsertAfter gibt man die Z-Order an, also ob das Fenster ganz vorne sein soll oder weiter im Hintergrund. Die Werte dafür weiss ich nicht. Vielleicht gehts, wenn du 0 oder nochmal hwnd angibst. flags genauso .. das sind irgendwelche Konstanten, wo man die Werte erst aus den Header-Dateien raussuchen müsste.

Thema: Diskussion zu "Message Send"
Am im Forum: GUI: Windows-Forms

Wenn du im ProcessStartInfo die RedirectOutput-Eigenschaft auf true setzt, kannst du die Ausgabe von net view direkt in einen String einlesen. Dadurch bräuchtest du wahrscheinlich die User.txt und die Bat-Datei nicht mehr.

string users = netViewProcess.StandardOutput.ReadToEnd();
netViewProcess.WaitForEnd();

Thema: Diskussion zu "Message Send"
Am im Forum: GUI: Windows-Forms

Brauchst du die Bat-Datei unbedingt? Was steht denn da drin?

Nimm lieber ein ProcessStartInfo-Parameter, statt eines Strings zum Starten eines Prozesses. Darüber kannst du das Verhalten viel besser steuern, z.B. auch das Dos-Fenster verstecken oder die Ausgaben umleiten.

Thema: Wie ähnlich sind sich C# & Java?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich hab mir Ruby mal bisschen angeguckt. Da geht das Konzept mit den Iteratoren ja noch viel weiter. Was ich gesehen habe, scheint es eine moderne Sprache zu sein, mit allem dabei was man braucht. Was ich nicht so gut finde ist, dass die Sprache nicht stark typisiert ist. Ist aber bei den wenigsten Skripsprachen der Fall.

Das hier hab ich nicht ganz verstanden:

class SongList
  def [](key)
    if key.kind_of ? (Integer)
      result = @songs[key]
    else
      result = @songs.find { |aSong| key == aSong.name }
    end
    return result
  end
end

Also der def [] Block definiert wohl einen Indexer. Wenn key ein Integer ist, wird einfach das Element am Index zurückgegeben. Ansonsten wird was ...? Ist aSong ne Klasse? Sieht nicht so aus. Vielleicht ist es ja das Ergebnis, das an result zurückgegeben wird. Komme nicht ganz hinter.

Beim Schreiben dieses Textes bin ich dahinter gekommen. Find iteriert durch alle Elemente in der SongList und |aSong| benennt wohl das aktuelle Element, das bei Übereinstimmung, also wenn der Ausdruck key == aSong.name true ergibt, zurückgegeben wird.

In C# würde es so aussehen.

public class SongList {
    public Song this[int key] {
        return songs[key];
    }
    public Song this[string key] {
        foreach(Song aSong in songs) {
            if(aSong.name == key) return aSong;
        }
    }
}

Die Anzahl der Codezeilen stimmt überein. Gar nicht schlecht für C# wo es doch in Ruby irgendwie kompakter aussieht ;-) Ich hab keine result-Variable definiert .. naja.

Thema: Wie ähnlich sind sich C# & Java?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ah, dann kommt diese Art des Iterierens wohl aus Ruby.

Bisher kenne ich yield in C# und Java nur als eine Methode der Thread-Klasse. Mit yield kann man "höfliche Threads" programmieren, die bei langwierigen, CPU-intensiven Aufgaben ab und zu mal die Ausführung an andere Threads abgeben. Besonders bei BSystemen ohne Zeitscheibe kann das notwendig werden. Bei C# spielt es also (noch) keine Rolle, da Windows Zeitscheiben unterstützt.

Thema: Was habt ihr bisher so programmiert ?
Am im Forum: Smalltalk

Ich hatte mal eine SocketMessenger-Klasse geschrieben. Die Klasse basiert auf TcpListener und TcpClient und läuft auch in einem eigenen Thread. Sie kann als Client oder als Server verwendet werden, je nach dem, mit welchem Kontruktor sie instanziert wird.

Es kommt ein sehr, sehr einfaches Protokoll zum Einsatz. Die ersten 4 gelesenen Bytes geben immer die Länge der nachfolgenden Nachricht an. Eine Nachricht wird zunächst vollständig in einen Buffer eingelesen, bevor dieser als MemoryStream an die IMessageProcessor-Eigenschaft zur Auswertung weitergegeben wird. Die Längenbytes werden dabei nicht weitergegeben. Die Rückrichtung funktioniert genauso. Der SocketMessenger fügt vor einer zu sendenden Nachricht einfach die Nachrichtenlänge ein.

IMessageProcessor ist die beim SocketMessenger austauschbare Verarbeitungskomponente. Dadurch wird die Klasse flexibel einsetzbar. Für meine Zwecke hatte ich einen IMessageProcessor geschrieben, der das erste Byte im Stream als Message-ID (heisst bei mir CommCode) interpretiert. Über die CommCode-Enum und eine switch-Anweisung werden die verschiedenen Nachrichten unterschieden und ich weiss genau, welche Daten sich im Stream befinden. Die Daten werden mittels BinaryReader aus dem Stream ausgelesen. Für die Rückrichtung verwende ich analog den BinaryWriter.

Die Klasse ist sehr robust. Man kann Client oder Server beliebig beenden und wieder starten. Die Verbindung wird einfach wieder aufgebaut. Das gleiche geschied, wenn ein Fehler auftritt.

Wer möchte, kann sich die Klasse hier runterladen und mal angucken oder ausprobieren. Dll, Quellcode, Msdn-Doku, ist alles dabei.


Gruß
Pulpapex

Thema: Wie ähnlich sind sich C# & Java?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

WebControls sind schon ne Eigenentwicklung. Sowas gibt es in Java nicht. Vielleicht werden ja irgendwann mal die Java Servlets um eine Bibliothek für WebControls erweitert. Da würde es jedenfalls am besten hin passen. Applets sollen die bestimmt nicht ersetzen. Statt dessen kann man einfach .Net Anwendungen in Html einbetten und im IE ausführen ... das soll die Applets ersetzen

Und JSP heisst Java Server Pages und nicht Java Script Pages ... Ist auch echtes Java, genau wie ASP muss es zunächst vom Web-Server kompiliert werden.


Gruß

Thema: Wie ähnlich sind sich C# & Java?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

C# hat Anlehnungen an viele Programmiersprachen (C, VB, Delphi, Java). Der größte Batzen kommt aber aus Java. Ein Java-Programm nach C# umzusetzen, dürfte noch am einfachsten sein, da es alle Java-Sprachkonstrukte so ähnlich auch in C# gibt (lock, inner classes usw.). Auch die besonderen .Net-Fähigkeiten wie Reflection, Serialization, Remoting usw. kommen alle von Java.

C# und .Net bieten noch ein paar Verbesserungen, die es in Java nicht gibt (properties, enums, foreach usw.). In der nächsten Sprachversion von C# kommen anonyme Delegaten hinzu. Diese entsprechen in etwa den anonymen Inner classes von Java. Der Haupteinsatzzweck wird wohl sein, dass man wie in Java die Ereignisbehandlung direkt beim Abonnieren eines Ereignisses mit angeben kann. Beispiel:

public void Init() {
    aClass.Changed += new EventHandler(object sender, EventArgs e) { Update(); };
}
private void Update() {
    // Zustand aktualisieren.
}
Templates soll es auch geben. Ein cooles Feature werden Iteratoren für die foreach-Schleife sein. Im Augenblick ist es so, dass sich ein IEnumerator immer die aktuelle Position merken muss. Bei Listen ist das kein Problem, es reicht ein einfacher Index. Bei komplexeren Datenstrukturen, wie z.B. Bäumen, ist schon ein Stack erforderlich. Mit einem neuen Schlüsselwort, der Name fällt mir leider nicht ein, ist das Implementieren des IEnumerator-Interfaces nicht mehr notwendig. Es reicht eine Methode zu implementieren, die nacheinander durch alle Elemente iteriert. Die Elemente werden aus der Methode heraus an die aufrufende foreach-Schleife gegeben. Danach wird die Methode an der alten Codeposition einfach fortgesetzt. Ich glaub das sah ungefähr so aus:

public object foreach() {

    // back ist falsch, wie das Schlüsselwort
    // richtig heisst, habe ich vergessen.
    // back gibt wie return ein Ergebnis zurück.
    // Die Methode wird aber nicht verlassen,
    // sondern später in der nächsten Zeile
    // fortgesetzt.
    back data[0];
    back data[1];
    back data[2];
}
In Java wird es in der nächsten Version auch ein paar Neuerungen geben ... die hauptsächlich aus C# übernommen werden Das wären z.B. Enums, foreach und Templates.

So entwickeln sich C# und Java immer weiter indem sie gegenseitig bei sich abgucken. Ist doch schön


Gruß
Pulpapex