Ja also wie bereits von Jack mehrmals geschrieben.
* Nimm als Input die csproj Datei
* Diese kannst du parsen und dir eine Liste mit c# Dateien machen
* Dann iterierst du über alle c# Dateien und öffnest diese mit einem Reader
* Nun einen passenden Regex nehmen, und alle Matches in die Resource schreiben und dort dann ersetzen, oder mit der von Jack vorgeschlagenen Extension Method
* Änderungen speichern
Das mit dem Thread ist eine gute Idee. Ich hätte noch eine andere, bist du dir sicher das du alle Control aufrufe Synchronisiert hast, daher mit Invoke aus dem GUI Thread heraus ausgeführt hast?
Desweiteren würde ich mal ein paar logs einbauen. Sprich immer beim tick event den Zeitstempel in eine log schreiben, und auch beim starten und beenden des Threads die Zeiten loggen. Eventuell siehst du dann schon die Überschneidungen auf die JuyJuka hingewiesen hat.
Desweiteren müsste ich für Properties ersteinmal eine extra Methode anlegen, die dann via delegate invoked werden kann. Oder kann ich Properties auch per delegate invoken, hab dazu bis jetzt noch nichts gefunden.
Davon abgesehen hat InvokeRequired in der Berechungsmethode einer (Modell)-Klasse auf keinen Fall etwas zu suchen.
Das ist ein eigener ThreadSynchronizer. Der hat nix mehr der GUI zu tun, sondern mit der eigenen Persitenz. Mit generisch meine ich eigentlich nur das Invoken aller verschiedener MethodenSiganturen/Properties ohne für jede ein eigenes Delgate anzlegen.
Zitat
Könntest du die Berechnung nicht einfach immer im Thread ausführen lassen
Nein das kann ich nicht, wie ich bereits geschrieben habe
ich suche derzeit nach einer schönen generischen Lösung für folgendes Problem. In einer klasse gibt es eine Methode die etwas berechnen soll. Diese greift Ihrerseits wieder auf andere Methoden andere Klassen/Object zu, entweder über Properties oder über Methoden.
Nun gibt es zwei möglichkeiten diese "Brechnungsmethode" aufzurufen. Einmal direkt, und einmal in einem separaten Thread. (Warum das so ist sei mal dahin gestellt!)
Nun müssen alle aufrufe die innerhalb der "Brechnungsmethode" aufgerufen werden synchronisiert werden, zumindets diejenigen die andere Klassen aufrufen (wenn die "Brechnungsmethode" in einem separaten Thread läuft). Nun hab ich keine Lust für alle diese aufrufe ein delegate zu definieren, und jedesmal zu schauen ob Invoke required ist.
Kennt jemand diesen UseCase bzw. hat einer eine Idee wie man sowas generisch lösen kann?
Ich hoffe ich konnte das Problem verständlich erläutern.
ich verstehe deine Fragestellung nicht genau, was genau willst du erreichen.
Wenn du die " Zeichen entfernen willst dann schau dir mal die string.Replace Methode an.
ich hätte mal eine allgemeine Frage. Ich habe eine PDB Datei jedoch mehrere dll's in verschiedenen Versionen. Wie kann ich raus finden zu welcher dll die pdb Datei passt?
Irgendwie kann ich die Frage nicht so wirklich in google formulieren :-(
Ich habe es jetzt folgendermaßen gelöst. In das Verzeichnis wo die Assembly des externen Prozesses liegt habe ich eine config zur Laufzeit (vor dem starten des Prozesses) gelegt. Diese enthält folgenden Key.
ich habe ein Problem bezüglich Debug.Liseners! Aus einer meiner TestAssemblies wird ein neuer Prozess gestartet der dann auch getestet wird. Dieser externe Assembly feuert ihrerseits ein paar Assertions via Debug.Assert(). Ich möchte diese Assertions für diesen externen Prozess abschalten.
den Lisenser removen. Aber das gilt dann nur für meinen eigenen Prozess. Die Assertions des externen Prozesses kommen weiterhin. Gibt es eine Möglichkeit über irgendeine Schnittstelle die Assertions des anderen Prozesses zu deaktivieren?
ich habe folgendes Problem. Und zwar werden an einer .NET Assembly zu Laufzeit resourcen geladen. Nun sind diese Resourcen aber leider nicht in der Assembly enthalten.
Ich wüsste aber zu Laufzeit welche strings ich returnen müsste. Jetzt meine Frage, kann man irgendwie dynamisch resourcen dazu binden, oder noch besser dynamisch returnen. Daher an der Assembly wird ja über den Resource Manager gefragt ob die Resource mit der entsprechenden ID existiert. Dort würde ich mich gern einklinken, und den entsprechenden Representanten zurück liefern.
das mit Mutex zu lösen ist natürlich der deutlich bessere Weg. Einfach einen eindeutigen Namen vergeben und beim Neustart schauen ob dieser Mutex schon existiert.
Schöner wäre freilich in der ersten Instanz eine Aktion auslösen zu könnnen und das Starten der zweiten Instanz abzubrechen, aber da weiß ich leider auch nicht wie das geht.
Ich glaub das ist das eigentlich Ziel, denn dann musst du das aktuelle Program nicht mehr beenden, sondern schaust einfach ob eine Instanz aktiv ist und führst dann einfach die Aktion an der Instanz aus. Dafür denke ich wirst du um COM nicht rum kommen, daher handle besorgen und eine bestimmte message an die Intanz senden. Diese muss dann darauf reagieren und die gewünschte Aktion ausführen.
ersteinmal noch ein paar Fragen zu deinem Problem. Von wo aus wird die Dispose ausgerufen und an welcher obigen Klasse? Die Exception deutet eindeutig darauf hin das du das Dispose aus einem Thread aufrufst der das besagte Object nicht erstellt hat!
Wenn du nun also nach dem ersten Upload erneut ein Screen addest, dann sagst du ja das Event kommt, hast du mal debugged ob dann auch ein neuer Thread erstellt wird und dieser dann auch gestartet wird?
Bau doch mal ein Event ein das gefeuert wird wenn der Thread beendet ist, dann siehst du auch ob die Updoad Methode ordnungsgemäß terminiert. Bezüglich des Multithreadings, kann es passieren das 2 Upload Methoden gleichzeitig ausgeführt werden?
Also wenn du in deinen abgeleiteten TreeView mit Nodes.Add() wirklich deine eigenen TreeNodes rein steckst, dann kannst du die danach selbstverständlich auch casten. Wenn das aber natürlich gewöhnliche TreeNode nodes sind, dann ist es doch logisch das du die nicht einfach auf deine TreeNode Klasse casten kannst!
Oder versuch mal anstatt eines SortedDictionaries ein normales zu nehmen, wenn dann der Fehler nicht mehr Auftritt ist das was herbivore gesagt hat wohl der Fall!
ich habe eine Problem mit Mutex. Ich nutze eine zugelieferte Assembly und die nutzt ihrer seits Mutex. Ich versuch mal kurz das Problem zu erklären. Vor jedem aufruf einer methode dieser Zulieferung wird gecheckt ob der Mutex "einmalig" ist. Daher Legt die Instanz einen Mutex mit folgenden ctor an.
Das Problem ist das immer dort m_IsOwned == false zurück kommt, daher es gibt im System schon mal so einen Mutex. Dieser kann aber nicht von der Komponente angelegt worden sein, denn dann hätte ich es ja mit dem Breakpoint gesehen. Was ich nun will ist folgendes. Kann man irgendwie feststellen welcher Prozess diesen Mutex angelegt hat, eventuell sogar welche Klasse?
Ich hab sonst keine Ahnung wie ich heraus bekommen soll wann und wo der Mutex das ERSTE mal erstellt wird!
definieren. Weil ich wie gesagt auf .NET 2.0 beschränkt bin. Und wenn ich das dann mit einem .NET 2.0 Compiler kompiliere, dann kommt die Meldung:
Zitat
The type or namespace name 'Func' could not be found (are you missing a using directive or an assembly refernece?)
Ich kann es vielleicht mit 2.0 nutzen, aber nicht mit 2.0 übersetzen, oder irre ich mich?
@herbovire
Zitat
bitte sowas immer selbst in der Doku nachschauen. Selbst wenn du nur die .NET 2.0-Doku installiert hast, online findet man auch für für neuere Framework-Versionen alles.
hast recht, da hätte ich vorher rein schauen sollen.
2.0 kennt Generics und Delegates, was hält dich davon ab, dein eigenes Func<T> zu definieren?
Ich wüsste nicht wie ich das definieren soll!? Was ist Func für ein Typ? Ist das ein generisches delegate mit einem dynamischen Rückgabetyp?
Und wenn das so geht, dann gleich die nächste Frage, wieso kann ich dann dort not null-able typen rein stecken, und in ein statisches delegate vom typ rückgabetyp object nicht?
das mit dem Func<T> ist ne gute Idee, geht leider nicht weil das m.E. erst ab .NET 3.0 geht, und wir sind hier ersteinmal auf 2.0 beschränkt.
Die convertion ist ne andere geschichte, da gibt es einen globalen life cycle, daher die entsprechende Komponente wir gefragt ob sie in einen entsprechenden DatenTyp wandeln kann, wenn ja wird sie gebeten einen converter zur Verfügung zu stellen. Das dictionary brauch ich nur um diese Komponente bisschen generisch zu halten.