Laden...

Forenbeiträge von Tarion Ingesamt 381 Beiträge

09.11.2010 - 22:14 Uhr

Schaitert an:

An object that implements the IConvertible interface.

Da damit keine eigenen Enums untersützt werden. Das andere werde ich jetzt mal testen, danke 😃

09.11.2010 - 01:11 Uhr

Den Type den der wert von value annehmen soll habe ich bereits als Type.

Type t = typeof(System.Double);
String value = "0.65";

object castedValue = Convert(t, value);

Die Convert funktion fehlt quasi 😃
Die soll zudem auch merken wenn man falsche Eingaben im String liefert.

09.11.2010 - 00:41 Uhr

Hi,
ich parse eine Datei und habe ganz viele Werte als String vorliegen. Zu jedem String habe ich einen Type.
Nun soll der String auf den gegebenen Type convertiert werden und in einer variable vom Type object gespeichert werden.

Etwas Beispielcode:


string value = values[key];
object castedValue = value; // TODO: How to convert value to the correct type?

defaultConstructor.Statements.Add(
						new CodeAssignStatement(
							new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), key), 
							new CodePrimitiveExpression(castedValue))
						);

Zum einen für Basitypen aus dem System Namespace, aber auch für eigene Enums.

Diese Seite habe ich bereits gefunden:
MSDN Generalized Type Conversion

Ich bin mir nur nicht sicher wie leicht sich damit ein so allgemeiner Ansatz realisieren lässt. Ich würde mich über Tipps freuen. Wenn ich es implementiert habe gibt es hier auch die Lösung.

Gruß, Tarion

08.11.2010 - 17:28 Uhr

Wäre ein module builder der

internal void SetContainer(IContainer container) 

aus deinem Framework automatisiert aufruft denkbar? Eventuell einfacher als es über die Events zu machen.

08.11.2010 - 11:14 Uhr

Oder ganz Simpel:


    public void DoSomethingOnFoo(Foo foo){
        //wie komme ich an die Instanz von Foo?
        foo.DoSomething();
    }
}

Spricht da etwas gegen?

Oder gib MyModule den container im Construktor mit und lagere die Register funktion aus.

02.11.2010 - 12:44 Uhr

So stelle ich mir das auch vor. Hab DLLImport auch schon im kleinen Stiel benutzt.

Und ich suche Erfahrungsberichte, wie das unter mono läuft.

01.11.2010 - 17:02 Uhr

Ich sitze an einer neuen Aufgabe. Ziel ist es Graphen zu modifizieren und mit den Graphen zu arbeiten.
Problem ist, die Graphen sind in einem C Programm als structs vorhanden.

Nun die Frage: Wie realistisch ist es, mit C# auf den generierten Graphen zu zu greifen?

Das C Programm, welches mir den Graphen (ein AST) generiert ist der nesC Compiler in einer bereits modifizierten Version.

Welche Voraussetzungen brauche ich um mit C# auf den AST zugreifen zu können?

  • Kann das C Programm eine executable bleiben oder brauche ich eine Bibliothek?
  • Ich denke ich muss alle Structs in C# "nachbauen", gibt es hier einen einfachen Weg?

Gibt es vielleicht Tools die mein Vorhaben vereinfachen?
Ich denke da in Richtung Serialisierung und Deserialisierung als mögliche Schnittstelle.

Gruß, Tarion

29.10.2010 - 10:50 Uhr

Ich hab ein wenig Fremdcode bei dem ich dachte, dass er es genau so macht. Ich werde das nochmal genauer prüfen grübel Ich meldem ich dann 😃

29.10.2010 - 09:37 Uhr

Für nicht system typen, also eigene Klassen, funktioniert die andere Methode aber einwandfrei.

29.10.2010 - 02:44 Uhr

Ich habe Strings und will wissen ob diese einen Type beschreiben.


typeName = "String";
Type type = null;

foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
{
    type = a.GetType(typeName, false);
    if (type != null)
    {
        break;
    }
}

if (type == null)
{
    type = Type.GetType(typeName, false);
}

// type ist null :(

Wie kann es sein, dass type immer null ist. Er findet einfach nicht den Type String. Gibt es da irgend eine Besonderheit zu beachten?

26.10.2010 - 12:49 Uhr

Dämlicher Fehler. Ich habe noch anderen Code gehabt der alle Typen durchsucht hat. Der muss dabei auf den halbfertigen Type gestoßen sein und ist dann am Konstruktor gescheitert.

26.10.2010 - 01:58 Uhr

Hier ist Beispiel Code:
TypeBuilder.DefineConstructor

Ich habe folgendes implementiert:


TypeBuilder tb = _moduleBuilder.DefineType("MyTestItem", TypeAttributes.Public, typeof(Item));

ConstructorBuilder cb = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { });

ILGenerator ilCode = cb.GetILGenerator();
ilCode.Emit(OpCodes.Ldarg_0); // Auch ohne diese Zeile der Fehler
ilCode.Emit(OpCodes.Ret);

tb.CreateType();

Das wirft mir folgende Exception:

System.InvalidOperationException: Für die Methode ".ctor" wurde kein Text definiert.
bei System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
bei System.Reflection.Emit.TypeBuilder.CreateType()

Ich kann einfach keinen entschiedenen Fehler in meinem Code finden. Auch dem Cosntuctor mal einen String zu geben wie im Beispiel macht es nicht besser.

Jemand eine Idee?

Gruß, Tarion

19.10.2010 - 14:33 Uhr

Folgende Zeile muss wie folgt lauten:

moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule", an.Name + ".dll");

Tja, nun gehts 😃 Der Blog hat mir tatsächlich geholfen, den hatte ich eben schon gefunden 😃

Super Danke. Sogar mein Server erkennt das ganze, nachdem ich ihm die Assembly in sein Array geschrieben habe 😃

19.10.2010 - 14:19 Uhr

Ich hab den oberen Code nochmal vereinfacht und nur den Type erstellt. Wenn ich die Assembly Speicher:

assemblyBuilder.Save(an.Name + ".dll");

und im Reflector anschaue, ist der Type nicht zu sehen.

Wo könnte das Problem liegen? Alle MSDNAA Beispiele sehen ähnlich aus. Ich kann keinen Fehler finden.

19.10.2010 - 12:44 Uhr

public static Type CompileTestItem()
		{
			TypeBuilder tb = moduleBuilder.DefineType("TestItem", TypeAttributes.Public, typeof(Item));
			ConstructorBuilder cb = tb.DefineDefaultConstructor(MethodAttributes.Public);

			// First, we'll build a type with a custom attribute attached.
			Type[] ctorParams = new Type[] { };
			ConstructorInfo classCtorInfo = typeof(ConstructableAttribute).GetConstructor(ctorParams);

			CustomAttributeBuilder myCABuilder = new CustomAttributeBuilder(classCtorInfo, new object[] { });
			cb.SetCustomAttribute(myCABuilder);

			ILGenerator myIL = cb.GetILGenerator();
			
			return tb.CreateType();
		}

Hab nun das zusammen gebaut. Das ConstructableAttribute sollte ja nun am Constuctor hängen. Der Server findet das Item dennoch nicht. Vielleicht ist es ein Problem mit meinem Server. Der Code sollte aber an sich die Lösung sein.

19.10.2010 - 12:24 Uhr

Sieht nicht so hilfreich aus.
Aktuell suche ich einge Möglichkeit den Basis Constuctor auf zu rufen:

        public static Type CompileTestItem()
        {
            TypeBuilder tb = moduleBuilder.DefineType("TestItem", TypeAttributes.Public, typeof(Item));
            ConstructorBuilder cb = tb.DefineDefaultConstructor(MethodAttributes.Public);
            // Von dem nun erstellen Konstruktor soll nun der Konstuktor des Bais Types mit einem einfachen Int aufgerufen werden
            // public Item( int itemID )

            
            return tb.CreateType();
        }

Edit: Und ich muss dem Constuctor ein parameterloses Custom Attribute zuweisen.

19.10.2010 - 12:10 Uhr

Jap, Scripte zur Laufzeit ändern ist auch nicht so wichtig. Dafür kann man die Anwendung auch neu starten.

In meinem Fall habe ich einen Spielserver wo jedes Item eine eigene Klasse ist. Das wäre halt super wenn man die Klassen einfach beim Serverstart generieren könnte und sie dann über die Refelction auffindbar sind.

Die alternative wäre wohl dem Server beizubringen mit ner art FlyWeight Item zu arbeiten, bei dem jedes Item dann vom gleichen Type ist. Leider ist das sehr tief in den Server integriert und könnte ebenso aufwendig werden.

19.10.2010 - 11:21 Uhr

Hi,
ich spiele mit dem Gedanken eine kleine Scriptengine zu schreiben. Über den Emit Namespace scheint man ja auch Klassen zusammen stöpseln zu können, dass werde ich gleich auch testen.

Eine Sache ist mir noch nicht ganz klar: Gibt es einen Weg, den generierten "code" also die neuen Klassen und Funktionen in eine laufende Assembly einzubinden, ohne den Umweg über eine neue Assembly zu gehen.
Oder muss ich in jedem Fall eine neue DLL generieren die ich dann linke?

Gruß, Tarion

14.10.2010 - 13:01 Uhr

Hi,
ich habe da mal selbst etwas geschrieben. Mittels TCPClient, SocketListener, und allem was man so brauchst. Im Endeffekt werden einzelne Nachrichten als Klassen abgebildet und können serialisiert und per TCP/IP versandt werden.

Natürlich traten immer wieder Fehler auf und ich hab mich sehr intensiv damit beschäftigt. Jedoch war ich mir nie 100% sicher das alles läuft wie es soll. Die ersten Probleme traten mit zu großen Datenmengen und Bildern auf. Das ganze System "verstopft" verliert Daten, ist langsam.

Daher suche ich aktuell eine alternative, zuverlässige Bibliothek, welche:

  • eventbasiert arbeitet
  • Clients verwaltet
  • Mit unerwarteten Verbindungsabbrüchen gut umgeht
  • Wenn möglich diagnostic Möglichkeiten hat

Muss nicht mal zwingend kostenlos sein, auch wenn eine Kostenlose Variante dazu ebenfalls super wäre.

30.09.2010 - 23:18 Uhr

In erster Linie geht es darum vorliegende Konzepte für die Spielsysteme um zu setzten. Die Konzepte sind teilweise noch unvollständig oder müssen aus vorliegenden Diskussionen konkretisiert werden.
Zudem sind auch kleiner Arbeiten wie Bugfixes und kleinere Änderungen am Quellcode notwendig.
Zuerst wird man sich in die Thematik und den Quellcode einarbeiten müssen und kann sich dann aus einem Pool von Aufgaben etwas aussuchen. Wir haben eine konkrete Roadmap.
Auch php / mysql Kenntnisse kann man im Rahmen der Homepage mit in das Projekt einbringen.

Später im Verlauf der Beta werden wir uns mehr auf Bugfixes beschränken und im weiteren Spielverlauf wird es dann wieder neue Ideen und Systeme geben die implementiert werden müssen.

Ein weitere Punkt sind die Tools, es fallen immer mal Arbeiten an bei denen ein Tool viel Arbeit vereinfacht, wir haben so z.B. einen Scriptgenerator der aus csv Dateien Scripte für Items und NPC's generieren kann. Auch hier kann mal die eine oder andere vom Server unabhängige Aufgabe anfallen. So brauchen wir auch noch einen Patcher (der aber wohl besser in c++ realisiert wird).

In letzter Zeit hatten wir auch ein etwas Zuwachs im Technikteam und somit ist auch die Teamfähigkeit eine wichtige Vorraussetzung für die Mitarbeit, so wie natürlich ein ernsthaftes Interesse an dem Projekt selbst.

Ich hoffe ich habe einen groben Überblick geschaffen, auf Details gehe ich gerne in einem direkten Gespräch ein.

Gruß, Tarion

27.09.2010 - 21:02 Uhr

Klingt super, hab schon gedacht es gibt gar nichts in Hamburg 😃

26.09.2010 - 14:37 Uhr

Arx-Obscura Homepage

C#-basiertes Rollenspielprojekt sucht Techniker

Für die Entwicklung einer Online-Rollenspielplattform werden aktuell interessierte Techniker und Programmierer gesucht. Der Server Emulator "RunUO" ist gänzlich in C# geschrieben und bietet daher eine gute Grundlage sein Wissen hobbymässig anzuwenden. Der Server läuft sowohl unter Windows und Linux (Mono).

Das Projekt ist kostenlos, die Mitarbeit unbezahlt.

Wer sind wir?
-> Arx Obscura ist das größte Dark Fantasy Onlinerollenspielprojekt auf Basis von Ultima Online.

Was bieten wir?
-> Erfahrene und kompetente Mitarbeiter in allen Bereichen.
-> Ein äusserst aktives, eingespieltes Gesamt-Team
-> Ein aktives, großes Team (~20 aktive Mitarbeiter, davon 5 Techniker)
-> Ein Technik-Team in dem man nicht alleine ist 😉
-> Diskussions- und Kritikfähigkeit
-> Offenheit für neue Ideen und Vorschläge
-> Eine freundliche, projektorientierte Atmosphäre.
-> Gesicherte Serverfinanzierung - dieses Projekt wird online gehen.
-> Einen sehr hohen Technik-Standard mit der Möglichkeit neue Dinge zu lernen
-> Eine erwartete Start-Spielerschaft von 50+ aktiven Spielern
-> Livebetrieb noch in 2012
-> Einen eigenen Client (derzeit in Arbeit): fluorescence

Und was ist morgen?
Viele Mitarbeiter aus diesem Projekt haben schon an anderen Ultima Online Projekten mit gearbeitet und zählen zu den besten der Szene. Das Projekt existiert seit November 2009 und hat seit dem erstaunlich große Fortschritte gemacht. Im Gegensatz zu vielen anderen Hobby Projekten, ist Arx-Obscura bereits lauffähig und hat eine begehbare Welt. Die Arbeit beschränkt sich auf das Anpassen dieser Welt und der Regeln in der Welt an die Vorstellungen des Teams.

Interesse?

Was ist Arx Obscura?
Wir sind ein Dark Fantasy Rollenspiel-Projekt mit einer etwas anderen Zielsetzung - anstatt in die Gefilde von Gut gegen Böse und Volk gegen Volk vorzustossen, konzentrieren wir uns vor allem auf ein Volk (Menschen) und einen mächtigen Hintergrund, technische Systeme die einen Regelberg ersetzen, und eine Modernisierung von Ultima Online, die sich unter anderem in der verwendeten Grafik, den Konzepten und auch der Verwaltung der Spielerschaft offenbart.
Die Teilnahme bei uns ist ab 18, da wir vor allem eine erwachsenere Spielerschaft ansprechen wollen, und die Modifikationen an Client und Dateien (und an RunUO) sind massiv, um unseren Ansprüchen gerecht zu werden.
Momentan legen wir die letzten Meilen zum Livebetrieb zurück, befinden uns mitten im Beta-Test, und sind mit den bisherigen Ergebnissen unserer Tests äusserst zufrieden!
Ideal wäre natürlich ein Start des Betriebs in den Frühsommer-Monaten, allerdings benötigen wir hierfür Unterstützung in der Technik, die leider momentan unterbesetzt ist (wie bei fast allen Shards 😉 ).

_Rollenspiel?
Ein Rollenspiel ist ein Spiel, in dem Spieler die Rollen fiktiver Charaktere bzw. Figuren übernehmen und selbst handelnd soziale Situationen bzw. Abenteuer in einer erdachten Welt erleben. Verwendet werden die eigene Fantasie, die Fantasie der Mitspieler und ein Regelwerk, das das Spiel strukturiert und eingrenzt. Bei spontanen oder traditionellen Rollenspielen (wie Räuber und Gendarm) sind die Regeln meistens implizit (z.B. das „Abschlagen“ des Gegners), während sie bei reglementierten Rollenspielen meist in Form eines oder mehrerer Handbücher vorliegen. Besonders bei reglementierten Rollenspielen gibt es häufig einen Spielleiter, der auch die Einhaltung der Regeln kontrolliert.

Ultima Online?
Ultima Online ist ein MMORPG (Massively Multiplayer Online Role Playing Game), in dem Spieler in einer imaginären Welt mit anderen Spielern oder mit computergesteuerten Figuren interagieren können. Diese Spielwelt wurde in vielen Bereichen an die virtuellen Welten der schon seit 1980 laufenden von Richard Garriott erschaffenen Singleplayer-Reihe Ultima angelehnt. Die Spielwelt existiert in ihren Grundzügen bereits seit 1997 und wurde nach und nach mittels Spielerweiterungen um neue Landmassen, Charakterklassen u.ä. stark erweitert und ergänzt. Innerhalb der Spielwelt können tausende andere Spieler ebenfalls Charaktere verschiedenster Ausprägung (vom Bettler bis zum Drachenbändiger) verkörpern und auf komplexe Art und Weise untereinander interagieren.

Es gab schon kurz nach der Veröffentlichung von Ultima Online freie Server mit vielen verschiedenen Konzepten, die bis heute vom Hersteller toleriert werden.

RunUO?
RunUO ist ein Quelloffener Servermulator für Ultima Online, welcher in C# programmiert ist. Die Software basiert auf dem .net Framework 2.0 und ist somit auch unter Linux mit Mono lauffähig. Programmiert wird hauptsächlich an den "Scripten" die ebenfalls in C# programmiert sind und beim Serverstart automatisch kompiliert und eingebunden werden.
Mehr Infos gibt es auf http://www.RunUO.com_

Eindrücke vom Spiel
Die Hauptstadt

Screenshots

31.08.2010 - 12:43 Uhr

Das Eigentliche Problem liegt wohl daran, dass die objekte A nie selbst serialisiert werden, sondern nur deren Identität.

Irgendwo werden beim Programmstart viele Instanzen von A erstellt. Probleme würden erst auftreten, wenn man mal die Liste im Code ändert. Dann würden sich ID's verschieben wenn ich einfach hoch zähle.
Wenn ich GUIDs vergebe, hat das gleiche Objekt A nicht immer die gleiche GUID nach nem erneuten Programmstart, und somit werden verweise ungültig.

Meine Lösung:
Ich habe jetzt eine Art PrimaryKey für meine Objekte A. Eine Eigenschaft die einzigartig ist und über die ich die Zuweisung mache. In meinem Fall ist es nen "Type".

  • Verschwindet ein Type aus dem System, wird einfach eine Referenz ungültig.
  • Kommt ein Type hinzu ist dieser eindeutig
  • Ändert ein Type seine Eigenschaften, ist es immer noch der gleiche Type und damit durchaus noch gültig.
31.08.2010 - 10:14 Uhr

Vielleicht geht es auch anders, hier mein Problem:
Ich habe viele Instanzen einer Klasse A, diese sollen eindeutig identifiziert werden können.
Jetzt wird ein Objekt B mit Referenzen auf A Serialisiert, soll aber nicht die ganze Klasse A mit serialisieren sondern nur eine Eindeutige Identifizierung.

Beim deserialisieren soll nun mit Hilfe der gespeicherten ID die richtige Klasse A aus einer Factory gezogen werden.

Wenn alle Klassen A durchnummeriert werden, geht es so lange gut wie sich nichts an der Erstellungsreihenfolge verändert und einzelne Instanzen nicht wieder verschwinden.

Pseudocode zum veranschaulichen:


class A {
public int Id;
public A(int id) {
this.Id = id;
}
}

// Somewhere:
new B(AFactory.NewA())
// -----------

class B {
public A A;
public B(A a) {
this.A = a;
}

public Deserialize(Reader reader) {
int aId = reader.ReadInt();
A = AFactory.Get(aId);
}
}

Wie also in AFactory.NewA() die IDs vergeben.
Man könnte irgend einen Hash verwenden der A eindeutig bestimmt.
Oder es gibt einen ganz einfachen anderen Ansatz den ich gerade nicht sehe.

29.08.2010 - 00:49 Uhr

Ein Rezept definiert wie etwas hergestellt wird. Dafür sind viele Informationen Norwendig, wie das benutzte Werkzeug, Benötige Items, Resultat Item, Anforderung an den Hersteller, etc..

Es wird in jedem Fall nur eine (oder wenige) Rezeptklassen geben.

Es darf im ganzen System aber nur genau definierte Rezepte geben, dafür die Factory.

27.08.2010 - 14:13 Uhr

Stelle mir das etwas wie den unterschied zwischen 2 Norm und Unendlichkeits Norm vor. Normalerweise willst du den kürzesten weg (2-Norm), aber je höher dein Faktor, desto eher bekommst du den kürzesten Weg gemäß einer anderen Norm (Der Unendlichkeitsnorm)

Kann ich jetzt nicht mathematisch begründen oder nachweisen, aber vielleicht liefert der Vergleich eine gute Vorstellung vom Einfluß der Strafe.

27.08.2010 - 13:57 Uhr

Eben, dass würde für den Datentyp sprechen. Zudem hat ein Repzept selbst keinen variablen Zustand. Wenn man ein Rezepzt ändert, ist es ein neues Rezept.

Ich hätte zudem immer noch eine Factory für die Rezepte welche Rezepte für bestimmte Berufe gleich als ganze Liste ausspuckt.

27.08.2010 - 12:16 Uhr

Folgende Situation. Ich habe verschiedene Klassen (Spieler), die etwas lernen können. Aus einem Pool von Rezepten. Jedes Rezept hat eigene Regeln, die sich beim anwenden des gelernten auswirken.
Rezepte beinhalten auch Referenzen auf andere Klassen des Gesamt Systems.

Jetzt ist die Frage wie man die Regeln implementiert. Im gewissen Sinne könnten die alles Singletons sein, weil die Regeln ja einzigartig sind. Jedes Rezept wäre eine Klasse die vom Basisrezept ableitet.
Singleton für mehrere hundert Klassen halte ich nun aber nicht für den richtigen Weg.

Das Singleton könnte man auch weglassen, und nur über eine Factory die Objekte beziehen, halte ich aber auch nicht für gut, da es niemanden daran hindert trotzdem "New" zu schreiben.

Nächster Ansatz wäre aus den Rezepten einen Datentyp zu machen und sie dann mit einem überladenen Gleichheitsoperator aus zu statten, der 2 Rezepte auf Gleichheit prüfen kann. Ein Rezept verliert damit seine Identität, die es ja auch eigentlich nicht haben soll.
Zu diesem Ansatz tendiere ich aktuell.

Als letztes habe ich noch das Flyweight Pattern im Kopf. Das ist wohl ähnlich wie der Ansatz mit den Datentypen nur auf Objektbasis. Eine Klasse für alle Objekte, aber auch hier werde ich wohl den Gleichheitsoperator überladen müssen um die Identität los zu werden, dann kann ich auch gleich Sturcts nehmen.

Gibt es noch einen Ansatz der genau mein Problem trifft? Würde gerne ein wenig darüber diskutieren.

18.08.2010 - 00:29 Uhr

Vielleicht noch irgendwas per Reflection?

16.08.2010 - 16:46 Uhr

Dann kannst du ja zu späterem Zeitpunkt die obige methode aufrufen. Wenn sie das erste mal wirklich gebraucht wird, oder (noch unsauberer) nach Ablauf eines Timer.

16.08.2010 - 16:11 Uhr
int iNumber = (int)0xB3 + (int)0x20;

geht es so nicht?

P.s. Schicker Avatar 😉

08.08.2010 - 14:32 Uhr

Ich denke dabei eher an KISS, vor allem bei dem Satz "Wieso nicht beides".
Der Aufwand scheint mir deutlich höher als der Nutzen. Das liegt natürlich auch etwas an dem Umfeld und den Ansprüchen des GUI Entwicklers. Aber ihm auf gut Glück ne toll Engine geben zu wollen führt meistens eher zu Problemen.
Wenn die Anforderungen konkret da sind, klar dann sollte man das machen.

Ansonsten bin ich immer noch für ein möglichst simples, typisiertes, Interface.

08.08.2010 - 02:04 Uhr

Also sollte man nur vermeiden gaaanz viele Einträge nacheinander einzeln ein zu hängen.
Pseudo:


for(int i = 0; i < bigCount; i++) {
myDictionary.Add(keysource[i], itemsource[i]);
}

08.08.2010 - 01:57 Uhr

Ich wäre eher **für **diese Variante:


  Comment comment = serviceCommet.GetCommentByID(_commentID);
  comment.User = serviceUser.GetUserByCommentID(_commentID);
  _guiText.Text = comment.Text;
  _guiUserName.Text = user.Name;

Sonst wäre ja eventuell comment.User und User.Comments möglich. Dann muss die Bussiniesslogik alle Zusammenhänge kennen und der GUI Programmierer muss wissen ob er nun den User holt um an die Comments zu kommen oder den Comment um an den User zu kommen. Was ist wenn beides geht, dann kann man User.Comments[0].User aufrufen?
Wenn das alles brav getrennt bleibt, gibt es diese Probleme nicht, der GUI Entwickler hat ein simpleres Interface. Die eine Zeile Code mehr in der GUI wäre mir das wert.
Für häufige Aktionen kann es ja noch einen weiteren Service geben, der dann explizit dafür da ist, user + comments aus der DB zu holen.

08.08.2010 - 01:46 Uhr

Und wenn nicht DI per Externem code, mach DI per Constuctor parameter. Klappt auch.

Das ganze wird per Reflection automatisiert. Ich denke nicht das es dafür nen großes Tutorial braucht. Bau dir sonst ne LightCore demo app zum testen. Die LightCore Klassen sind so simpel, dass ich es auch ganz ohne externe Hilfe gerafft hab 😉 Und Open Source, kannst du also auch direkt mit in dein Projekt kompilieren wenn du willst. Oder halt einfach mal in den Soruce gucken, dafür würde ichs aber vorher mal ausprobieren.

Den Ansatz mit dem Helper namens Context würde ich auch bevorzugen.

08.08.2010 - 01:12 Uhr

Aber bitte richtig:


string MyFloatToString(float f) {
return f.ToString("0.00");
}

Was ToString für deinen Zweck als Argument braucht musst du selbst suchen. Das war jetzt nur ausm Kopf.

06.08.2010 - 16:27 Uhr

Jap, so hab jetzt nochmal etwas mehr Zeit zum antworten.

Du kannst dir in c# nen Keypair erzeugen. diese kannst du aber nur schwer für dein PHP Script nutzten, weil das PHP Script nen anderes format will (C# speichert als xml)

Ich hatte mir nen Keypair mit makecert.exe erstellt Dabei kam irgendwann ne passwortgeschützte Keyinfo datei raus *.pfx.

Um daraus den Private key in c# xml form zu bekommen:


        private string GetPrivateKeyFromPfx(string file, String password)
        {
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();


            X509Certificate2 x509 = new X509Certificate2(file);
            if (File.Exists(file))
            {
                x509.Import(file, password, X509KeyStorageFlags.Exportable);
            }

            rsa = (RSACryptoServiceProvider)x509.PrivateKey;
            return rsa.ToXmlString(true);
        }

Und alles andere kann diese kleine Klasse:


        private RSACryptoServiceProvider rsa;

        public SerialCryptoServiceProvider()
        {
            InitializeRSA();
        }

        private void InitializeRSA()
        {
            const int PROVIDER_RSA_FULL = 1;
            const string CONTAINER_NAME = "SLProxy";
            CspParameters cspParams;
            cspParams = new CspParameters(PROVIDER_RSA_FULL);
            cspParams.KeyContainerName = CONTAINER_NAME;
            cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
            cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";
            rsa = new RSACryptoServiceProvider(cspParams);
        }

        public void CreateKeys(string path)
        {
            InitializeRSA();
            //provide public and private RSA params

            string dir = Path.GetDirectoryName(path);
            string file = Path.GetFileNameWithoutExtension(path);
            string extension = Path.GetExtension(path);
            string secretFile = Path.Combine(dir, file + "_sk" + extension);
            string publicFile = Path.Combine(dir, file + "_pk" + extension);

            StreamWriter writer = new StreamWriter(secretFile);
            string publicPrivateKeyXML = rsa.ToXmlString(true);
            writer.Write(publicPrivateKeyXML);
            writer.Close();

            //provide public only RSA params
            writer = new StreamWriter(publicFile);
            string publicOnlyKeyXML = rsa.ToXmlString(false);
            writer.Write(publicOnlyKeyXML);
            writer.Close();
        }


        public string CreateSignature(string text, string privateKey)
        {
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(privateKey);
            
            RSAPKCS1SignatureFormatter rsaFormatter = new RSAPKCS1SignatureFormatter(rsa);
            rsaFormatter.SetHashAlgorithm("SHA1");

            SHA1Managed sha1 = new SHA1Managed();

            byte[] valueAsHash = sha1.ComputeHash(StringToBytes(text));
            byte[] signedValue = rsaFormatter.CreateSignature(valueAsHash);
            rsa.Clear();
            return BytesToHexString(signedValue);
        }

        public bool ValidateSignature(string text, string sig, string publicKey)
        {
            if (text == null || sig == null || publicKey == null) return false;

            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(publicKey);

            RSAPKCS1SignatureDeformatter rsaDeformatter = new RSAPKCS1SignatureDeformatter(rsa);
            rsaDeformatter.SetHashAlgorithm("SHA1");

            SHA1Managed sha1 = new SHA1Managed();

            byte[] valueToHash = sha1.ComputeHash(StringToBytes(text));
            byte[] signature = HexStringToBytes(sig);

            return rsaDeformatter.VerifySignature(valueToHash, signature);
        }


        public string EncryptData(string data, string publicOnlyKeyXML)
        {
            rsa.FromXmlString(publicOnlyKeyXML);

            //read plaintext, encrypt it to ciphertext
            byte[] plainbytes = Encoding.UTF8.GetBytes(data);
            byte[] cipherbytes = rsa.Encrypt(plainbytes, false);
            return Convert.ToBase64String(cipherbytes);
        }

        public string DecryptData(string data2Decrypt, string publicPrivateKeyXML)
        {
            rsa.FromXmlString(publicPrivateKeyXML);

            //read ciphertext, decrypt it to plaintext
            byte[] getpassword = Convert.FromBase64String(data2Decrypt);
            byte[] plain = rsa.Decrypt(getpassword, false);
            return Encoding.UTF8.GetString(plain);
        }

        private string BytesToString(byte[] bytes)
        {
            Encoding encoding = Encoding.GetEncoding(1252);
            return encoding.GetString(bytes);
        }

        private byte[] StringToBytes(string data)
        {
            Encoding encoding = Encoding.GetEncoding(1252);
            return encoding.GetBytes(data);
        }

06.08.2010 - 12:45 Uhr

Wie lautet denn die Exception die eigentlich geworfen wird?

Edit:
Schau da nochmal rein: Digitales Signieren von strings

04.08.2010 - 00:14 Uhr

Kommt drauf an über wie viele Router das Paket muss, ich weiß grad nicht ob es bei 0 ider -1 gedropt wird.

03.08.2010 - 19:46 Uhr

TTL sollte > 0 sein, nicht?

02.08.2010 - 12:49 Uhr

Es geht nicht um die genaue Anzahl, aber es löst sein Problem und es hat bei mir funktioniert.
Heute würde ich auch die Async Methoden nutzten, aber gegen meine Lösung spricht sonst nichts.

Was Sicherheit angeht ist Prevention immer besser und einfacher als Detection, weil Detection auch False-Prosive Resultate liefern kann. Man muss deutlich mehr beachten als wenn man bekannte Sicherheitslücken durch Präventive Maßnahmen einfach gleich ausschließt.

01.08.2010 - 23:46 Uhr

Ich hab das mal so gemacht, dass es 10 Threads gibt die alle Clients Abhandeln.

Alle Clients in einer Queue
Thread nimmt Client herraus
Thread Bearbeitet Client
Thread fügt ihn hinten wieder an (Oder nicht falls Client disconnected)
Das machen mehrere Threads gleichzeitig. Die Queue muss halt synchronisiert sein.

01.08.2010 - 23:33 Uhr

Naja Application.ProgramVersion gibt es in einer WPF Anwendung nicht mehr.

01.08.2010 - 21:30 Uhr

Hallo,

In WPF Hat ein Fenster jetzt keine ISDisposed eigenschaft mehr,...

Wieso sollte es auch? Es implementiert kein IDisposable. Man darf nicht immer versuchen alles so machen zu wollen wie in Windows Forms.

Wie mans richtig macht steht in der Doku:

If you want to show and hide a window multiple times during the lifetime of an application, and you don't want to re-instantiate the window each time you show it, you can handle the Closing event, cancel it, and call the Hide method. Then, you can call Show on the same instance to re-open it.
Mit der Vorgehensweise umgehst du das Problem überhaupt prüfen zu müssen ob das Window schonmal geschlossen wurde.

Und wie bekomme ich dann im Closing event heraus ob die Application noch läuft?
Also außer selber ne eigene statische Variable an zu legen 😉


if (_aboutBox == null)
            {
                _aboutBox = new AboutBox(new AboutViewModel());
                _aboutBox.Closing += (s, e) => { 
                  e.Cancel = /*TRUE if App is running*/; 
                  _aboutBox.Hide(); 
                };
                _aboutBox.Show();
            }
            else
            {
                _aboutBox.Show();
                _aboutBox.Focus();
            }

Ich will nicht alles wie in WinForms machen, deshalb frage ich ja 😉

@CSL
Bei deinem Code muss ich ja in jedem Fenster noch eigenen Code implementieren, da ist mir meine Variante lieber.

Edit:
Es geht mir auch gar nicht primär darum die Form nicht neu zu laden, das wird erst bei langen Ladezeiten notwendig und dann isses auch mehr Aufwand wert. Eher darum ob es eine schönere Lösung als meine ganz oben angegebene gibt.

01.08.2010 - 15:11 Uhr

In WPF Hat ein Fenster jetzt keine ISDisposed eigenschaft mehr, wie findet man raus, ob es geschlossen ist, um keine Exception bei .Show() zu erhalten?

Eine Lösung hab ich, aber gibt es nichts eingebautes mehr?


private void About_Execute()
        {
            if (aboutBox == null)
            {
                aboutBox = new AboutBox(new AboutViewModel());
                aboutBox.Closed += (s, e) => { aboutBox = null; };
                aboutBox.Show();
            }
            else
            {
                aboutBox.Focus();
            }
        }

01.08.2010 - 14:36 Uhr

Wie komme ich an die AssemblyFileVersion in WPF, über die assembly bekomme ich nur die AssemblyVersion

01.08.2010 - 14:03 Uhr

Okay, ich hab mich auch noch mehr damit beschäftigt. Was ich suche ist ein Delegate command was die RoutedUI funktionalität untersützt. Also auch die Testenkombinationen und Namen für die UI.

Edit:
Was geht (ohne DelegateCommand) ist:

Im CodeBehind:

this.CommandBindings.Add(viewModel.ExitCommandBinding);

Und im ViewModel das entsprechende CommandBinding an die gewünschten Funktionen. Kann ich das Binding in der Form auch ohne CodeBehind über Xaml definieren?

31.07.2010 - 20:48 Uhr

Gibt es eine Möglichkeit ohne zusätzlichen eigenen Code den Code eines Commands im ViewModel aus zu führen statt im CodeBehind?

31.07.2010 - 17:18 Uhr

Ich bin da noch nicht ganz hinter gestiegen, wofür es denn nun zwei Versionen gibt.
Ich nutzte immer die FileVersion wenn es um Updates geht und zeige diese auch im Titel meiner Application an. Eine AboutBox zeigt standartmäßig aber die AssemblyVersion an.

Kann mir jemand den Unterschied nochmal näher erklären. Wann sollte man was verenden?

30.07.2010 - 18:29 Uhr

Noch jemand eine Idee wo die DLL liegt, ansonsten tritt nähmlich gerade das Problem auf, das die Software bei anderen nicht läuft, obwohl sie Visual C# 2008 Express installiert haben.

Oder gibt es gute Alternativen?