Danke für die Antwort. Funktionieren tut es aber leider nicht, vor allem darf ich den stdin nicht schliessen, da die Kommunikation dynamisch ist. Dafür habe ich eine andere einfache Lösung gefunden:
Das bewirkt, dass stdout nicht gebuffert wird und dadurch funktioniert es. Natürlich funktioniert das nur wenn man das Zielprogramm beeinflussen kann, was ich glücklicherweise bis zu einem gewissen Grad kann.
Da stellt sich mir aber auch noch die Frage wie 'cmd.exe' das macht. Offensichtlich sind die Ausgaben erst mal in einem Buffer (welcher auch mit \n oder ähnlichem nicht geleert wird). Leert 'cmd.exe' den stdout-Buffer der aufzurufenden Programme selbst oder wie kommt das an den Inhalt? Darf ein programm überhaupt einen Filebuffer eines anderen Programmes einfach so flushen?
Es interessiert mich zwar, aber unbedingt wissen muss ich es nicht. =)
Sorry für den Push, aber ich beisse mir noch immer die Zähne an dem Thema aus. Vielleicht suche ich viel zu weit weg?...
Das zuletzt genannte OSS-Projekt hat mir leider auch nicht wirklich weitergeholfen...
:(Naja, falls jemand ne andere einfache Lib kennt (c, c++, whatever) mit der ich einen Wrapper schreiben kann den ich dann in C# nutzen kann wäre ich auch schon zufrieden.
Einen weiteren push werde ich selbstverständlich nicht mehr machen.
Ich habe eine exe-Datei, welche in C geschrieben ist. Dieses Programm ist Konsolenbasiert und stellt sowas wie ne primitive Shell zur Verfügung. Einfacher gesagt einige Kommandos. Diese Kommandos können Parameter und eine Ausgabe haben.
Ich möchte in C# nun einen (GUI-)Wrapper für das Ding schreiben.
Ich habe bereits sehr mit der Weiterleitung von StdErr/Out/In gekämpft. Das ganze habe ich mit der Process-Klasse versucht. Insofern ich nur stdout und stderr weitergeleitet habe ging das auch soweit, halt ohne input.
Als ich aber den Input auch weitergeleitet habe ging stderr/stout nicht mehr? Seltsamerweise funktioniert das alles ohne Probleme bei der "cmd.exe".
Bereits mit einem einfachen C-Tool, dass n'Endlosloop mit einem Echo der Eingabe hat gehts nicht mehr (Wieso auch immer??!).
Mit dem in diesem Thread verlinkten "ProcessRunner" habe ich das ganze für ein Test-Tool (Dummy-Ausgabe) hingekriegt. Jedoch nicht für mein Tool selbst.
In der Konsole "cmd.exe" kann ich das Tool problemlos ausführen. Wieso kann ich den Redirect aber nicht sauber machen?
Das ganze scheint komplizierter zu sein als es sich anhört? Die Problemstellung ist ja relativ einfach: stderr/out/in (in Echtzeit) weiterleiten.
Das Zieltool nutzt mehrere Threads und ich kann auch Einfluss darauf nehmen, falls da etwas geändert werden muss.
mfG
b3nj
-edit
Da die Beschreibung wahrscheinlich nicht optimal ist hier noch eine weitere Darstellung des Probelms.
Ein sinnloses Beispiel-Tool in C, das wahrscheinlich überhaupt nicht schön geschrieben ist:
#include <stdio.h>
#include <process.h>
#include <windows.h>
void __cdecl dummy_thread(void* dummy) {
int cnt;
for (cnt = 0;; cnt++) {
printf("%4d %4d\n", (int)GetCurrentThreadId(), cnt);
Sleep(5000);
}
}
int main() {
int threads = 10;
while (--threads) {
_beginthread(dummy_thread, 0, NULL);
printf("You typed '%c'.\n", fgetc(stdin));
}
printf("Stop typing!\n");
dummy_thread(NULL);
return 0;
}
Kompiliert habe ich es mit mingw. Auf jeden Fall enthält es Eingaben, Ausgaben und Threads.
Ein Beispiel-Code um die EIn und Ausgabe zu steuern, auch der ist nicht unbedingt schön, dafür aber sehr einfach:
private static void PrcoessReader(Process p)
{
int readed;
while ((readed = p.StandardOutput.Read()) > 0)
{
Console.Write((char)readed);
Console.Out.Flush();
}
}
static void Main(string[] args)
{
ProcessStartInfo startInfo = new ProcessStartInfo("a.exe");
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardInput = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
startInfo.ErrorDialog = true;
Process process = new Process();
process.StartInfo = startInfo;
process.Start();
new Thread(() => PrcoessReader(process)).Start();
while (true)
{
process.StandardInput.WriteLine(Console.ReadLine());
process.StandardInput.Flush();
continue;
}
Console.ReadKey();
}
Der funktioniert jedoch nicht.
Dann habe ich noch einen Anlauf-Versuch mit dem "ProcessRunner" gemacht:
Zum Crosspost: Der ist atsächlich von mir. Die Frage ist sehr speziell deshalb habe ich an zwei Stellen gefragt. Kann man mir übel nehmen und ist wie ich gerade gesehen habe auch nicht erlaubt. Ok, das ist mein Fehler.
Das mit den Listen ist auch gut zu wissen, aber ich habe auf Arrays abgezielt ja.
@MrSparkle:
Deine Erklärung ist schon mal gut. Naja, grundsätzlich geht es um (m)einen Lehrer der der Meinung ist, dass die physische Länge des Arrays entspricht und die logische der Anzahl an Feldern die exlizit zugewiesen wurden. Da habe ich ihm widersprochen und das hat ihm überhaupt (!) nicht gefallen.
Aber das klingt schonmal gut. Damit lässt sich argumentieren:-) Weil die Erklärung des Lehrers will mir einfach nicht in den Kopf. (Hinterfragen sollte ja nicht schlimm sein^^)
Letztens bin ich auf die Begriffe logische und physische Länge eines Arrays gestossen. Explizit auf C# .Net bezogen.
Die physische Arraylänge wird wohl die "Länge" des Arrays sein (.Length). Wie aber ist die logische definiert?
Eigentlich dachte ich, dass die logische Länge eines Arrays = die physische Länge ist (zumindest in C#). Jetzt aber habe ich gehört, dass die logische Länge die Anzahl der explizit definierten indizes ist. Das macht für mich in C oder ähnlichen Sprachen irgendwo noch Sinn, da hier die Werte in einem Array ja nicht vordefiniert sind, in C# jedoch schon (imho default(T)).
=)Google sagt dazu auch nicht viel, daher wende ich mich mal an euch.
Von wegen Prof fragen: Das habe ich auch versucht (per Mail) nachdem ich erfolglos einige Schüler gefragt habe. Der meint, dass hätte man in der Stunde besprochen und ansonsten steht es in jedem halbwegs guten Buch an erster Stelle. Wer nicht in der Stunde war ist selbst schuld. (er hats ein bisschen freundlicher geschrieben^^)
naja, ich hoffe mal, dass die frage nicht an der prüfung kommt. notfalls habe ich ja jetzt aber jede schwammige antwort noch eine begründung.
da ich nicht anwesend war kann ich es nicht genau sagen. ich hatte bis jetzt auch nicht viel mit dem begriff zu tun.
auf jeden fall dachte ich laut den berichten meiner kollegen, dass alle übergabeparameter als aktualparameter definiert sind. die verwendete variable innerhalb der funktion ist dann der formalparameter.
bsp:
static void main()
{
int i = 0;
DoIt(i, i); //i ist hier jeweils der aktualparameter
}
static void DoIt(int a, int b)
{
//a und b sind formalparameter
}
irgendwie ist der begriff praktisch niemandem geläufig. naja, :-)
Hier die Frage inklusive allen Antworten:
Was ist ein Aktual-Parameter?
[ ] Eine Variable im Rahmen einer Schnittstelle
[ ] Eine Variable, die im Unterprogrammaufruf verwendet wird
[ ] Eine Variable mit einem konstanten Wert
[ ] Eine Variable, die keinen festen Datentyp hat
[ ] Eine Variable, die beim Unterprogrammaufruf einen Wert besitzt
Gleich meine Gedanken dazu:
1) Falsch
2) Richtig
3) Falsch
4) ?
5) Wenn ich schon dabei bin: ?, wobei ich tendiere zu Ja. Die Frage wäre hier: Wird null auch als Wert angesehen...?
wir nehmen in der c# durch. man musste nur in die lektionen kommen, wenn man die grundlagen nicht beherrscht.
diese beinhalten bis jetzt: schleifen, primitive datentypen, funktionen
dadurch dass ich schon seit jahren c# programmiere sah ich es noch nicht als nötig dazuzukommen.
wir haben bald eine prüfung dazu, das ist auch ok. nun haben wir per mail eine probeprüfung erhalten, diese ist soweit auch nicht schwer, ausser eine Frage kann ich mir nicht eindeutig beantworten.
Pro Frage sind mehrere Antworten möglich, ich schreibe aber nur die von mir nicht verstande auf:
Was ist ein Aktual-Parameter?
...
[ ] Eine Variable, die keinen festen Datentyp hat
...
ich habe auch mehrere leute gefragt, jedoch ist sich niemand wirklich sicher, auch nicht die die den Unterricht besucht haben...
hauptsächlich frage ich mich was hier "fester datentyp" in dem zusammenhang bedeutet. ein aktualparameter muss ja nur zum zieltyp (vererbung, inplizite konvertierungen...) kompatibel sein und nicht genau diesem typ entsprechen.
also, das mit ctrl/shift habe ich auch schon probiert (habe vergessen es zu erwähnen).
Das funktioniert ganz gut wenn man zuerst auf die "ballern-taste" (ctrl) klickt und dann auf eine andere, dann wird beides wahrgenommen.
klicke ich jedoch zuerst auf eine andere taste und bleibe auch auf ihr (z.B. wenn ich ganz nacht rechts springen will) und möchte zwischendurch ballern, dann ist der aufruf der ersten taste (in diesem fall der rechte pfeil) verloren. somit funktioniert das nur, wenn ctrl zuerst geklickt wird, was ja nicht immer der fall sein muss.
die funktion "GetAsyncKeyState" werde ich mit gleich mal anschauen, vielen dank.
ich habe gerade probiert ein kleines spiel (so à la space invaders) für die konsole zu machen, mal um zu schauen ob und wies geht.
jetzt bin ich aber über ein problem gestolpert. ich habe eine kleine "engine" geschrieben um die ganze ausgabe ein bisschen zu abstrahieren, diese engine beinhaltet auch die eingabe, in diesem fall der tastendruck des users.
viele tasten gibt es nicht: rechts, links, space (feuern).
intern wird für die eingabe der tasten ein eigener Thread erstellt und gestartet, dieser ist +/- so aufgebaut (ich habe den code nicht hier):
while (true)
{
ConsoleKey key = Console.ReadKey().Key;
if (KeyPressed != null)
{
KeyPressed(this, new ConsoleKeyPressedEventArgs(key));
}
}
Leider kann ich nicht parallel tasten lesen, bzw. nachschauen ob eine spezielle taste gedrückt ist oder nicht.
ich möchte machen, dass man gleichzeitig laufen und ballern kann, dadurch, dass ich aber nur eine taste auf einmal erkennen kann geht das natürlich nicht, entweder läuft man oder man ballert.
also:
ist es möglich irgendwelche events (keydown/keyup) aus der konsole abzufangen? oder kann ich irgendwo eine Liste aller gerade geklickten Tasten abrufen?
und kann man das ohne die WinApi machen? weil, wenn ich c# code dann probiere ich zumindest immer so plattformunabhängig wie möglich zu bleiben:-) falls es aber nur mit der WinApi geht, dann ists auch nicht so schlimm.
Ich werde das RFC gleich mal anschauen und ausprobieren. vielen dank.
@marsstein
ich habe gerade nachgeschaut, aber das xml-tag ist nötig. der tag wird im browser auch angezeigt, den source davon hab ich mit dem chrome geholt, keine ahnung weshalb der mit das tag im source nicht angezeigt hat, in der oberfläche ist es aber eindeutig vorhanden.
Ich habe schön öfters mal einen Http-Post in C# abgeworfen. Als Daten habe ich dann immer einzelne normale parameter genommen, welche ich wie folgt in den http-body gefüllt habe:
Zitat
a=asdf&b=dfgh&someeothervalue=asdasd
nun muss ich aber einen http-post für dieses formular machen:
wie ich im firefox mit tamper gesehen habe wird der inhalt nicht wie oben beschrieben gesendet. weiss jemand wie ich diesen vorgang in c# umsetzen kann?
mfG b3nj
-edit-
so ich habe nochmals fleissig gegoogelt.
ich habe noch einen anderen lösungsansatz gefunden:
wobei die url stimmt. das eingegebene xml sollte auch ein gültiges xml zurückgeben, ich erhalte als antwort jedoch:
Zitat
<?xml version="1.0" encoding="utf-8"?>
<response>
<FunctionNotParsable>
<mac>XX:XX:XX:XX:XX:XX</mac>
<retVal>12</retVal>
<retStr>Input XML file does not validate</retStr>
</FunctionNotParsable>
</response>
ich habe mal den cgi-log auf "debug" geschaltet, das folgende kommt dabei raus:
Zitat
42 [1081655824] INFO main (main.cpp:199) - Started ./unimodmcGwIfApp.cgi
49 [1081655824] INFO main (main.cpp:228) - Got xml from the CGI request [\_xml version]"1.0" encoding]"utf-8"_^-*\request^-* \getGwMacAddress^-* \mac^00Z11Z22ZddZEeZfF\Omac^-* \OgetGwMacAddress^-*\Orequest^]
50 [1081655824] INFO main (main.cpp:247) - <?xml ... ?>no found!
55 [1081655824] INFO main (main.cpp:254) - Ended ./something.cgi
hier noch zum vergleich ein funktionierender aufruf mit dem oben angegebenen formular:
Zitat
56 [1081655824] INFO main (main.cpp:234) - Parsed xml in memory
74 [1081655824] INFO main (Utils.cpp:99) - Parsed style sheet [getFunctionName.xslt]
82 [1081655824] INFO main (Utils.cpp:106) - Applied style sheet [getFunctionName.xslt]
84 [1081655824] INFO main (Utils.cpp:125) - Stripped string
85 [1081655824] INFO main (Utils.cpp:127) - Decoded string
90 [1081655824] INFO main (Utils.cpp:99) - Parsed style sheet [getMac.xslt]
92 [1081655824] INFO main (Utils.cpp:106) - Applied style sheet [getMac.xslt]
93 [1081655824] INFO main (Utils.cpp:125) - Stripped string
94 [1081655824] INFO main (Utils.cpp:127) - Decoded string
95 [1081655824] INFO main (main.cpp:191) - Mac ok
96 [1081655824] INFO GetMacAddress GetMacAddress.cpp:8) - Running
102 [1081655824] INFO main (main.cpp:254) - Ended ./something.cgi
ich habe auch schon probiert das encoding vom WebClient zu ändern, ich habe Default und UTF8 probiert, beides nützte nichts.
Ich habe einen HttpWebRequest, welcher auch tadellos funktioniert. Jetzt habe ich aber das Problem, dass ich für das Tool auch Proxyeinstellungen verwenden können muss.
Diese liegen unter einer URL als .cfg-Datei vor und werden auf den Client-PC's jeweils im Firefox unter "Extras/Einstellungen/Erweitert/Netzwerk/Einstellungen" als "Automatische Proxy-Konfigurations-URL" eingetragen.
Meine Frage dazu, kann ich eine solche Konfigurationsdatei irgendwie einlesen und auch benutzen?
Ich habe bereits ausführlich gegoogelt und hier nach Lösungen gesucht, jedoch hat alles nichts geholfen.
Meine aktuelle Lage:
-Ich entwickle gerade eine Software (bzw. sie existiert schon) welche auf Remoting basiert (ich habe bewusst Remoting und nicht WCF genommen, wobei ich in Zukunft wahrscheinlich mal mehr über WCF lernen werde)
-Diese Software bringt einen Fehler sobald der Client verbinden möchte, bzw zu dem Zeitpunkt, bei dem eine Methode aufgerufen wird "Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte"
-Firewall usw. ist aus
Ich habe auch mehrere Beispielprojekte heruntergeladen um das ganze zu testen.
Dieses funktioniert auf einem anderem Notebook (XPSP3 Pro) problemlos, auf meinem Entwicklungsnotebook (Vista Ultimate SP1) erscheint jedoch auch der oben genannte Fehler.
Ich hab mal ein TestProjekt erstellt, welches jedoch auch nicht funktioniert, hier der Code:
IServer
public interface IServer
{
string GetHelloWorld();
}
Server
public class Server : MarshalByRefObject, IServer
{
internal static Server DefaultInstance { get; private set; }
public Server()
{
Console.WriteLine("I am here...");
DefaultInstance = this;
}
public string GetHelloWorld()
{
return "Hello World";
}
}
Program.cs Server
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
IDictionary props = new Hashtable();
props["port"] = 50050;
ChannelServices.RegisterChannel(new TcpChannel(props, null, provider), true);
Server srv = new Server();
ObjRef refGreeter = RemotingServices.Marshal(srv, "test");
while (true)
{
Console.ReadKey();
Console.Write("\b");
}
Ich habe schon alles möglihc eprobiert, aber nie hat es funktioniert.
Hier habe ich z.B. die Struktut SECItem nachgebaut:
public struct SECItem
{
public Int32 type;
public char[] data;
public Int32 length;
}
Und hier die Methodendeklaration:
[DllImport(@"nss3.dll", CharSet = CharSet.Ansi)]
public static extern int NSSBase64_DecodeBuffer(object val, ref SECItem output, StringBuilder input, UInt32 inputLength);[/csharp
Wobei diese habe ich schon tausendmal geändert, halt aus Not mal alles ausprobiert.
Aktuell sieht der Aufruf so aus:
[csharp] SECItem output1 = new SECItem();
output1.data = new char[1000];
output1.length = 1000;
...
NSSBase64_DecodeBuffer(null, ref output1, code, (UInt32)code.Length);
Das Ergebnis ist eine SafeArrayTypeMistmatchException, mit der folgenden Message:
"Das angegebene Array hat nicht den erwarteten Typ."
:Dok, der fehler war zu offensichtlich, thx für den hinweis
@JAck30lena
naja, der aufbau erlaubt mir bis jetzt nichts anderes, wobei ich mir doch nochmals alles durch den kopf gehen lasse, wenn möglich werde ich es noch so umcoden, dass die gui im hauptthread läuft.
Ok, diesen weg habe ich auch schon probiert, da der "nicht-gui-code" jedoch in dem thread laufen sollte in der er gerade läuft muss ich zwangsweise die gui in einen eigenen thread ploppen:
static void Main(string[] args)
{
new Thread(delegate()
{
Form form = new Form();
form.Show();
Application.Run(new Form());
}
);
Console.ReadKey();
}
Ich hatte heute bei einem Programm ein Problem, dieses habe ich nun auf das nötigste minimiert:
In einer Konsolenanwendung soll eine Form geöffnet werden, der Code soll jedoch trotzdem weiterlaufen. Hier wäre ein zweiter Thread nötig denke ich, aber egal was ich bastle die Form friert ein, hier der Beispielcode:
static void Main(string[] args)
{
new Form().Show();
Console.ReadKey();
}
Der Verweis zu Windows.Forms muss halt noch hinzugefügt werden.
Weiss jemand wie ich das einfrieren der Form verhindern kann?
Ich habe eine Projektmappe mit zwei Projekten, einem Windows Dienst und einem Windows-Forms-Programm.
Der Dienst verrichtet seine Arbeit im Hintergrund, die Forms-Anwendung möchte ich dazu nutzen den Status anzuzeigen (Was wo verbeitet wird/wurde). Hierfür muss ich zugriff auf die daten des dienstes haben, jedoch weiss ich nicht wie ich direkt zugriff auf ihn habe.
kurz:
weiss jemand wie ich zur laufzeit auf die objekte (m)eines windows dienstes zugreifen kann?
Ich und zwei Kollegen wollen zusammen etwas programmieren. Jetzt verwendet jeder von uns aber einen anderen programmierstil (ich z.B. fange bei allen Feldern mit _ an, alle Eigenschaften gross geschrieben und Parameternamen klein...).
ein ähnliches problem haben wir bei windows forms, ich z.B. nenne die Textbox tb, andere benutzen den prefix txt.
gibt es da irgendeinen weitverbreiteten standard? halt allgemein wegen prefixen usw.?
in klassen benutze ich immer #region Fields #endregion usw. für alle möglichen "Dinge" die in Klassen vorkommen, da habe ich auch eine feste Reihenfolge. gibt es auch hier eine lösung um klassen mehr oder weniger übersichtlich zu halten oder ist diese schon ok?
Dieses Array wird ja definiert, aber halt nicht vollständig wie es scheint.
Zitat von "ikaros"
Das Array benötigt das Attribut der Klasse zum Serialisieren.
Das Array hat ja eigentlich schon in seinem Namen bzw. Tagname den Klassennamen des Typs (ArrayOfUser) oder verstehe ich da etwas falsch?
Die Klasse User sollte eigentlich auch serialisierbar sein:
[Serializable()]
public class User
Sorry, ich bin gerade ein bisschen verwirrt. Ein Link auf ein brauchbares Dokument zu diesem Thema wäre gut, habe in google nicht viel zu der Übertragung von Objekten gefunden.
Ich arbeite gerade an einem Webservice, welcher eine Funktion "Test" besitzt. String's, Int's und andere primitive Datentypen kann ich ohne Probleme senden. Ich habe jetzt jedoch eine Klasse "User" und möchte einen User-Array in der Webfunktion zurückgeben.
Wenn ich den Code debugge dann wird ein Array zurückgegeben, welcher die Länge "1" hat. Im xml-File, das zurückgegeben wird steht jedoch das:
sry, dass ich die fehlermeldung nicht mitangegeben habe, hier:
Zitat
System.Data.SqlClient.SqlException: Fehler beim Anfügen einer automatisch benannten Datenbank für die Datei C:\Programme\Microsoft Visual Studio 8\Common7\IDE\App_Data\Database.mdf. Eine Datenbank mit diesem Namen ist bereits vorhanden, die angegebene Datei kann nicht geöffnet werden, oder sie befindet sich in der UNC-Freigabe.
die Datei Database.mdf und der Ordner App_Data existieren an der genannten stelle übrigens nicht.
wie macht man es denn normalerweise wenn man eine datenbank als datei in das projekt einfügt? wird schon irgendein connection-objekt oder etwas in der art erstellt?
hab alles probiert aber die db kann nicht geladen werden.
ich weiss nicht ob es am "debug-webserver" liegt oder an dem connectionstring. im iis habe ich es noch nicht getestet, weil das ganze sollte ja auch im debuger laufen?
gibt eine einfache möglichkeit einen int32 zu einem byte[4] bzw einen int64 zu einem byte[8] zu konvertieren? oder muss ich da selbst eine funktion schreiben.
vielen dank
mfG b3nj
-edit-
glaub schon wieder im falschen forum erstellt, sry -> Basistechnologien und allgemeine .NET-Klassen
bei ****** gabs mal nen "bug" (oder wars n'"feature"?), naja auf jedenf all konnte man gratis ohne anmeldung sms mit nem selbst gewählten absender versendet werden.
ich wollte ein fenster (n'popup) für eine bessere texteingabe für ein feld erstellen, dies habe ich dann auch hingekriegt, zumindest halbwegs hier mein problem:
Webseite.aspx
hier existiert eine html-textbox tbShort.
hier wird dieser js-code aufgerufen:
function TextPopup()
{
window.open("TextPopup.aspx", "", "width=600,height=600").focus();
}
das popup enthält eine html-textbox tbText, der text wird auch geladen.
irgendwann hat man ja fertig getippt, dann wird durch einen normalen html-button dieses js ausgeführt: