Stimmt, ich denke ich habe es immer mit Count<>() also leeren spitzen Klammern versucht, was nicht ging. Intellisense zeigt mir nämlich Count() gar nicht als Methode an, daher hab ich es wahrscheinlich auch nicht probiert.
Nun alles gelöst, vielen dank 😃
Hallo,
mal was nebenbei ohne einen extra Thread zu öffnen. Wenn ich so etwas wie OfType uf eine Collection mache a là
collection.OfType<T>() und darauf ein Count machen möchte, muss ich ja explizit beim Count auch ein T angeben, ist das so richtig? Oder gibt es da einen Trick über implizite Typisierung? Ich mein collection.OfType<T>().Count<Was wohl?>() sollte ja irgendwie defaultbar zu T sein, außer ich will einen parent typen oder so
Oh, genial, habe ich übersehen, ich habe bei Intellisense nur bei .Last rumgelungert.
Danke!
Ich habe eine Collection, die aus beliebigen Untertypen von einer Klasse X bestehen kann.
Ich suche nun ein LINQ Query bei dem ich das Letzte Element aus einer Collection selektiere, das vom Typ T ist.
Geht es anders, als über ein (from x in collection where x is T select x).Last<T>() ?
Das mit Object kompiliert. Werde ich testen. Danke.
Aber verwirrend ist es dennoch. Ich kenne das von C++ dass erst der konkrete Template Parameter zur Kompilierung benutzt wird und erst dann wird mit dem bekannten Typ geprüft, ob das, was ich fabriziert habe auch kompiliert
Ich habe ein Verständnisproblem bei den Generics in dieser Methode:
protected void creteElement<T>(CreatorBase creator)
{
T t = (T)(creator.CreateIt());
}
Das wirft mir die Meldung:
Cannot convert type "MeinTyp" to 'T'
Das sagt er mir bei der definition der Methode. Woher will er dass denn wissen? Ich hab doch noch keine konkrete Instatiierung dieser Methoden mit einem Template Parameter gemacht. Er kann doch T im Moment noch garnicht auflösen.
Die Methode ist so in einer nicht generischen Klasse untergebracht. Ist das das Problem?
Hallo,
ich habe hier eine schöne Wrapper Klasse gefunden:
http://www.elitepvpers.de/forum/epvp-coders/118712-c-windows-api.html
Ich hab die User32 Funktionalität von DaMoe 80 dazu gepackt und kann nun Tastenbefehle an Fenster senden.
Danke für die Hilfe 😃
Achso, jetzt verstehe ich.
Na da hoff ich doch mal, dass das Ding nur für private Testzwecke genutzt wird... Wobei das so schon gegen die Lizenz verstoßen sollte.
Was meinst du?
Hallo,
danke für den Code.
Was mir nicht klar ist, weil ich mich mit WinApi nicht auskenne: Wie kann ich zum Beispiel auf Ok oder "Abort" oder "Abbrechen" bei so einer Anwendung klicken?
Über Forms hätte ich das Element ja gefunden, aber so bin ich unsicher.
Hmm ok, aber wie komme ich an die innereien eines Win32 Handles?
Ich würde sehr ungerne auf WinApi zurückgreifen müssen
Also MessageBox ist ja Modal und ich bin gerade in einem Integrationstest bei dem das Verhalten einer Komponente getestet wird. Units wurden schon getestet, aber die Kombination von Logik, GUI(Modale MessageBox), Folgelogik sind noch nicht verifiziert.
Nun ploppt im automatisierten Test quasi eine Messagebox auf, was ja nicht so hilfreich ist.
Im Testcase mache ich vor dem Aufruf, der zu der Messagebox führt einen Timer auf, der nach einer Sekunde aufgerufen wird. Sprich
Meine Hoffnung war nun, dass im callback des Timers über Application.OpenForms oder so auf das modale Fenster im Vordergrund komme.
Nur finde ich das modale fenster einfach nicht
Ich habe eine Applikation die ab und zu Messageboxes generiert. Nun habe ich parallel einen Thread, der ein paar Werte sammeln muss.
Dafür benötige ich jedoch ein Handle auf das aktive fenster. Gibt es da so etwas wie Application.FocusedWindow? Ich kann die Logik der Applikation selber nicht modifizieren, so dass die irgendwo immer ein Flag setzt, wenn ein modales Fenster erzeugt wird.
Ich bin hier also auf die C# Funktionalität angewiesen
Scheiße! Anfängerfehler§$%§
Ich hab da noch durch gesteppt und gedacht "Property Getter wird aufgerufen, alles gut soweit"
Ich glaub ich mach mal ne Pause.
Danke 😃
Tippfehler ja. Sorry beides klein geschrieben.
Ich korrigiere das mal
Hallo,
ich muss sicherstellen, das ich bei einem Event immer nur einmal den gleichen Handler registriere. Gleichzeitig muss das remove save sein. Sprich wenn ein Benutzer
Event -= seinHandler macht, darf da nichts fliegen.
Das wird benötigt, weil nicht garantiert werden kann, ob das remove nach dem add kommt oder nicht.
Folgender Code funktioniert jedoch nicht, das -= wirft eine Exception Object reference not set to an instance of an object.
protected PropertyChangedEventHandler _foo;
public event PropertyChangedEventHandler foo
{
add
{
if (_foo== null || _foo.GetInvocationList().Contains(value) == false)
{
_foo+= value;
}
}
remove
{
// Save remove
if (_foo!= null && _foo.GetInvocationList().Contains(value) == true)
{
_foo-= value;
}
}
}
Ein Breakpoint beim Remove wird jedoch nie angesprungen wenn ich in einer anderen Klasse
Parent.foo-= Parent_Foo;
aufrufe.
Muss das Event vorher irgendwie existieren?
Edit: Typo korrigiert
Klingt gut, danke 😃
Hallo,
ich hatte da mal was im Hinterkopf, bin nun aber unsicher.
Bietet Visual Studio eine Möglichkeit, Stringliterale im Code irgendwie zu sammeln und zu extrahieren um Support für Lokalisierungen zu vereinfachen?
Ich hab ein Projekt, wo viele Strings verwendet worden sind und lokaliseren ist jetzt erstmal total unspassig weil ich durch ne Menge von Code durch muss um Strings zu finden.
Hallo,
was ich eigentlich Suche ist eine Art Visitor Konzept, das wie folgt funktioniert: Es gibt ein Event auf das sich mehrere Handler registrieren können. Wenn das Event gefeuert wird, soll jeder Handler der Reihe nach aufgerufen werden.
Dabei soll jedoch jeder Handler entscheiden dürfen, ob die weitere Ausführung der Verarbeitung abgebrochen werden soll oder nicht.
Einfaches Beispiel:
public delegate bool Val(Data d);
public event Val ValidateData;
if(ValidateData(data))
{
// Arbeite mit den Daten
}
ValidateData soll ein event sein, auf das sich eine beliebige Menge an Handlern aufschalten können. Wenn einer der Handler aber false returned, dann soll die komplette Verarbeitung der Kette oder alternative nur das Endergebnis von ValidateData false liefern.
Das erste Ansatz benötigt mehr logik, es muss quasi immer geprüft werden, ob der nächste Handler aufgerufen werden soll, oder nicht.
Der zweite Ansatz sollte (dachte ich) mit einem Event, der ein bool returned erschlagen werden können.
Allerdings verstehe ich den nutzen von solchen returns nicht.
Ich gehe doch richtig in der Annahme, das wenn 2 Handler auf einem Event mit einem Bool lauschen und der Reihe nach abgearbeitet werden, so ist das Ergebnis des Events immer das return des letzten Handlers, oder?
Sprich wenn der erste Handler false, aber der zweite true returned, so ist das Event mit einem true beendet worden.
Kann man hier die Ergebnisse auf irgendeine Art und Weise aggreggieren? also definieren, dass der bool, der returned wird über && aggregiert wird, oder so?
Also die TestDLL wird ins gleiche Bin verzeichnis generiert, wie alle anderen und dann temporär kopiert.
Ich habe im MSDN Forum jedoch bereits eine hilfreiche Antwort bekommen:
Eine "name".testrunconfig Datei anlegen, oder die vorhandenen LocalSettings.testrunconfig editieren.
Dort enable deployment auswählen und die DLLs eintragen, die zusätzlich kopiert werden sollen.
Dann läufts ohne manuellem kopieren.
Hallo,
entschuldigt die späte Antwort.
Also das Hinzufügen zum Projekt und Kopieren wenn neuer funktioniert nicht. Die DLLs werden nicht kopiert.
DeploymentItem ist zu umständlich, wenn ich 100 Methoden habe, muss ich 100 mal dutzende von DeploymentItems haben, weils laut hier How to: Configure Test Deployment nur auf Methoden angewendet werden kann.
Die Idee mit einer zusätzlichen DLL ist nicht gerade handlich und erfordert Workarounds fürs drumherum, eventuell werde ich es aber testen, wenn keine bessere Alternative existiert.
Die Einfachheit von Managed Code 😃
Wie habe ich das vermisst.
Danke 😃
Ich habe eine Methode, die n byte[,] Arrays generiert. In .net sind Arrays Reference Types, soweit ok, aber was passiert mit einem Array, was in einer Methode erzeugt wird und dann in eine Liste gelegt wird:
public void doSomething(Queue<byte[,]> m)
{
var f = new byte[,] {....}
m.Enqueue(f);
}
public void START()
{
var q = new Queue<byte[,]>();
// hier wird q befüllt
// hier die methode
doSomething(m);
// was ist mit dem byte Arrays aus doSomething?
}
Es werden in doSomething in der Regel mehr, als nur ein Arrays erzeugt, also kann ich es nicht einfach mit return zurückgeben.
Ich kann nicht ganz nachvollziehen was passiert?
Sind Referenztypen in C# gezählt? So ne Art Smart Pointer? Oder hab ich, nachdem doSomething durchgelaufen ist im Queue einen Verweis auf einen freigegeben Speicher?
Auch wenn doSomething ein byte[,] returnen würde, ist es ja im Endeffekt eine lokale Variable, die aus dem Scope der Methode geht und eigentlich entweder zerstört werden müsste, oder ein Leck verursacht?
Es wird hier doch nirgendswo eine implizite Copy Operation ausgeführt, oder? Würde ja bedeuten, dass das Framework hier implizit ein Buffer.BlockCopy mit der korrekten Größe macht?
Gelöst:
Zusätzlich muss bei Advanced noch Debug Info auf full (oder pdb) gesetzt werden.
Ein propreitäres Framework prüft beim Start alle gelandenen DLLs und zählt, welche im Release und welche als Debug gebaut worden sind und wirft dann eine Meldung, dass Debug und Release gemischt worden sind.
Dies wird mittels
System.Diagnostics.DebuggableAttribute
Der Assembly Custom Attributes erreicht. Wenn diese numm sind, dann zählt es als Release, andersrum als Debug.
Zusätzlich meldet Visual Studio beim Start
"The following module was build either with optimizations enabled or without debug information (...)"
Ich bin nicht in der Lage, eine Debug Version zu erstellen. Woran kann es liegen? Die Konfiguration ist selbstgebaut, aber ich habe in den Properties des Projekts nicht viele Optionen.
"Define DEBUG constant" ist an
"Define TRACE constant" ist an
"Optimize code" ist aus
Was übersehe ich noch?
Lexware fällt auf die Nase. $(Configuration) in die proj Datei reinzuschreiben hilft nichts, wenn $(Configuration) nicht der Name des Ordners ist, in dem die Assembly liegt 😕
Wenn ich ein Compilation Symbol definiere, ala CONFIG=MeineConfig, so kann ich diese dann nicht mittels $(CONFIG) in der proj Datei einsetzen. Hmpf!
Lexware scheint mein Retter zu sein 😃
Danke!
Debug und Release waren nur Beispiele.
Es gibt DX 9 Debug und Release und DX 11 Debug und Release.
Ich habe nur der Einfacheit halber nur von Debug und Release geredet.
Es ist Third Party Code, der XP und neuere Betriebssysteme unterstützt und da DX 11 auf XP nicht läuft, ist DX 9 Fallback.
Aber das sollte ja auch keine Grundsatzdiskussion werden, warum wir es so machen. Wir haben an der Stelle keine Wahl, weil es eine Middleware ist, die wir selber bauen.
Es geht um Assemblies.
Ein Beispiel ist eine Konfiguration von Anwendungen, die Direct X unterstützen. Es passieren unter DirectX 9 andere Dinge, als unter DirectX 11, daher benötige ich für die beiden Configs auch zwei unterschiedliche Referenzen.
Man kann ja eine Referenz nicht unter einer bestimmten Config hinzufügen, sondern immer nur für das Projekt im Allgemeinen
Wenn ich mit Library X baue, aber Library Y ins Bin kopiere, geht das nicht total in die Hose?
Es geht hier auch nicht unbedingt um Debug und Release, sondern andere Konfigurationen, die andere Ausgangssituation vorraussetzen, was halt nicht geht, wenn ich nur eine Lib anziehen kann
Dessen bin ich mir voll bewusst und die Assemblies sind mit voller Absicht unterschiedlich.
Ich mein, in C++ kann ich für verschiedene Builds verschiedene Libs anziehen, warum wurde das da nicht eingeführt?
Hallo,
ich habe hier eine Assembly, die im Release anders ist, als im Debug. Es existiert kein Projekt von der Assembly, ich habe nur die DLLs.
Wenn ich nun ein CSharp Projekt aufsetze, so kann ich ja mit Add Reference ne Lib auswählen. Das Problem ist, ich kann für Debug und Release nur eine auswählen.
Gibt es da einen Weg, die Assembly als Referenz buildabhängig zu haben?
Ich weiß, dass es geht, wenn man bei Add Reference ein Projekt in der gleichen SLN nimmt, dann wird im Debug Debug und im Release Release genommen, aber ich habe ja, wie gesagt, nur die dll.
Danke
Vs 2008
Erledigt.
msbuild kann direkt Projektmappen bauen.
Ich ging irgendwie davon aus, dass es über ne XML Datei eine .cproj Mappe generiert und nicht baut
Wir bekommen von einem Drittanbieter eine Middleware, die leider nur aus Solutions und Projektmappen besteht.
Mein Ziel ist es, eine Build-Umgebung zu haben, um so etwas automatisiert zu bauen.
Ich hab da an msbuild gedacht, weil das im Gegensatz zu anderen Build Scripten einerseits C# Projekte generieren kann und andererseits habe ich die Hoffnung, dass msbuild ein Tool zum Bauen von cproj Bietet.
Ich bin seit einigen Tagen am Einlesen in msbuild und mir ist klar, wie ich ein Build Script baue, was mir letztendlich dann eine Solution und eine cproj Datei generiert. Aber gibt es einen Weg ein vorhandenes cproj automatisiert zu bauen?
Ich meine das so ähnlich, wie über nmake, nur dass ich halt keine Makefile sondern eine cproj und sln Datei habe
(VS 2008, btw)
@TheGear, ich konnte es noch nicht testen, daher habe ich dazu noch nichts gesagt.
@haarrrgh: Die DLLs sind alle 3rdparty. Sprich kein Source vorhanden
Versuchs mal im PostBuild event mit zukopieren.
Ja, aber wohin denn? Das ist doch der Titel meines Threads. Der Name wird aus meinem benutzernamen und Gruppennamen meines Rechners plus einem zeitstempel dynamisch generiert. Daher temporärer Name. Das ist ein C# Test Projekt, kein C# Projekt. Es werden dort spezielle Verzeichnisse angelegt und wieder gelöscht und für die finde ich kein Makro
Ne, sagte ja, kann diese nicht als Referenz hinzufügen, oder meinst du was anderes mit "hinzufügen" ?
Ich habe einen Unit Test in C# gebaut, der mehrere DLLs benötigt. Die kopiert die IDE beim Start auch immer korrekt in ein "TestResults\TEMPORÄRER_NAME" Verzeichnis.
Mein Problem ist, das kopieren reicht nicht. Der temporäre Name, also das Verzeichnis wird nach der Ausführung des Tests ja gelöscht und durch eine trx Datei ersetzt.
Der Haken an der Sache, bei dem erstellen dieses temporären Verzeichnissen kopiert die IDE zwar DLLs, aber das Ergbnis ist kein funktionsfähige Testanwendung. Da eine der kopierten DLLs dynamisch zur Laufzeit eine DLL nachläd, welche aber nicht in das temporäre Verzeichnis kopiert worden ist.
Ich kann die betroffene DLL nicht als Referenz in das Projekt einfügen, weil es keine gültige Net oder Com DLL ist.
Wie soll man mit so etwas umgehen? Wie stelle ich sicher, dass diese DLL gefunden werden kann?
Edit: Ich habe schon versucht den Pfad, wo die DLLs liegen, die nicht mitkopiert werden als Referenz Pfad anzugeben, aber das funktioniert nicht.
Ich kannes auch nicht in den globalen Environment Path aufnehmen, weil so das Projekt auf anderen Rechnern nicht mehr geht
Ich habe folgende XSD:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="A">
<xsd:sequence>
<xsd:element name="GroupedWith" type="Position" nillable="true" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Position">
<xsd:sequence>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Im Endeffekt ist ein Knoten "Position" ein Element von A.
Nun generiere ich mir die C#Klasse daraus und habe bei dem GroupedWith aber das Problem, dass ich niemals ein null bekommen kann.
[XmlElement(Type=typeof(Position),ElementName="GroupedWith",IsNullable=false)]
[EditorBrowsable(EditorBrowsableState.Advanced)]
public Position __GroupedWith;
[XmlIgnore]
public Position GroupedWith
{
get
{
if (__GroupedWith == null) __GroupedWith = new Position();
return __GroupedWith;
}
set {__GroupedWith = value;}
}
XSDObjectGen generiert mir bei dem getter automatisch ein new, wenn null.
Das ist aber absolut nicht das, was ich will. Ich erwarte dort null. Sprich wenn keine gruppierung vorhanden ist, soll ich auf keien Fall ein Objekt erzeugt bekommen.
Nun bekomme ich aber XSDObjectGen nicht dazu, einfach __GroupedWith zu returnen, ohne da die == null abfrage zu machen.
Ich habe bereits imXML Versucht dem GroupedWith ein "nillable=true" zu vergeben, ohne erfolg
Ich habe ein XSD Datei definiert und mittels des Tools xsd.exe auch die passenden serialisierbaren XML Dateien bekommen.
Nun bin ich aber Level 2 😄 und benötige korrektes Handling von zirkulären Referenzen und Referenzen an sich (also keine Klone, wenn zwei mal das gleiche Objekt referenziert wird)
Nun hilft mir ja WCF da enorm, weiter: Serialization and Deserialization
Das händelt referenzen und co, aber was ist nun mit meiner XSD Datei? Ich generiere den C# Code ja nicht vonhand und würde das auch ungern tun müssen.
Gibt es da etwas, was XSD in WCF konforme C# Klassen umwandeln kann?
Funktioniert denn das auch mit Events? Stack Traces helfen mir nur bedingt, da ich ja garnicht weiß, wohin er im Code überhaupt springt
Ich arbeite mit Source einer Anwendung die komplett auf Events aufbaut. Es gibt defakto sehr wenige lineare Methoden aufrufe sondern viel mehr gefeuerte Events.
Mein Problem ist, wenn ich versuche zu verstehen, wie das Programm funktioniert, muss ich den Events hinterher.
Hat C# eine Möglichkeit, alle gefeuerten Events zu verfolgen primär wäre es beim Debuggen hilfreich, aber eine log ausgabe tut es auch. Sobald eigene Events gefeuert werden, komm ich ja in die Methoden rein, aber wenn die .net Events gefeuert werden, hilft mir ein Step Into nicht und ich verpasse die folgenden aufrufe
Ich habe aus einer XSD eine cs Klasse generiert, die eine Liste vom Typ T[] beinhaltet. Sprich ein Array.
Wenn ich die Liste fülle so muss ich diese ja mittels new T[meine Größe] initialisieren.
Da feste Größen aber lame sind, würde man ja dafür ein List<T> nehmen, das befüllen und dann ein ToArray() aufrufen.
Meine Frage aber, gibt es einen Weg, so etwas zu machen:
Obj.meinArrayOfT = new List<T>().Add(einT).ToArray();
Mir ist klar, dass ich hier den Umweg über ToArray sparen kann. Worauf ich aber hinaus will, ist die Frage, ob irgendwo über einen Wrapper oder so das Konzept von Fluent Interfaces bereits realisiert wurde. Sprich alles was normalerweise void zurück gibt, return anstelle von void immer this.
Nettes beispiel:
var liste = new List<T>().Add(t1).Add(new T(..)).Add(t2);
Das wäre wirklich ab und zu recht hilfreich
Alles geschlossen und neu gebaut. gleiches Problem.
von 3rdparty wird nicht geerbt, nur benutzt
Wir haben ein Projekt bei dem die Form1 eine Reihe von 3rd party assemblies anzieht.
Diese werden korrekt referenziert und geladen. Anwendung läuft super.
Nun erstelle ich eine Form2 die von Form1 erbt. Sie befindet sich im gleichen Projekt.
Nun passiert folgendes:
Der Designer von Form2 funktioniert nicht mehr. Ich bekomme einen Error:
Could not load file or assembly '3rdPartyassembly, Version=..., Culture=neutral, PublicKeyToken=null' or one of its dependencies. Das System kann die angegebene Datei nicht finden.
Der Callstack verweist auf den Form1 Constructor
Die gleiche Meldung steht in der Error list als Warning wobei File leer ist, Line und Column auf 0 verweisen.
Die Assembly ist jedoch definitiv vorhanden, weil Form1 sie ja vorher benutzt hat.
Ich habe mal using 3rdPartyAssembly in Form2 eingetragen, wird auch erkannt.
Die Warnung bekomme ich dennoch.
Die Anwendung läuft aber dennoch. Sprich wenn die Main anstatt Form1 Form2 startet, ist alles in Ordnung.
Allerdings würde ich schon gerne den Designer haben.
Hat jemand eine Idee, womit das zusammen hängt? Mit der 3rdParty Assembly eher nicht, wie ich meine.
IDE ist VS 2008
Edit: dieser Fehler taucht auch auf, wenn ich in Form2 den base constructor garnicht aufrufe...
Jepp, keine Frage.
Das wird durchaus auch passieren.
Aber aktuell ist es noch nicht passiert und der Host kann im Moment nicht geändert werden.
Das soll auch kein Produktivcode werden, sondern eher ein Proof of Concept des Plugins.
Die Leute, die sich das angucken, verstehen nichts von Callbacks oder ähnlichem, sondern brauchen quasi ne visuelle Demo
Was eventuell interessant wäre: Ist es möglich per Reflection eine Methode aus einer anderen Assembly zu überladen oder sich da reinzuhängen?
Die Hauptanwendung hat update routinen, die keine Events oder etwas in der Art feuern, wenn sie beendet worden sind. Ich muss aber nach dem Update zusätzliche Operationen ausführen, die immer nach dem Update ausgeführt werden müssen.
Problem ist: Mein Plugin kriegt nicht mit, wann das Update durchgeführt worden ist
Nö. Auf A habe ich kein Zugriff, aber A wirft andere Events, an die ich mich probehalber anhängen kann, dann ist der Ctor der Form schon durch und ist verfügbar
Ne, ist auch nicht strong named.
Wie gesagt, wenn ich diesen AssemblyKey Block aus der App rausnehme, dann meckert er ja nicht mehr
Das mit dem Public Key ist aber nur nötig, wenn strong-named Assemblies im Spiel sind, oder? Und ich sehe nicht, wo das der Fall sein soll.
Die Anwendung hat kein /key und signiert sicht meiner Meinung nach ja auch nicht, das hab ich durch sn.exe gecheckt.
Das heißt es sollte garkein Public Key geben