Laden...

Forenbeiträge von DFDotNet Ingesamt 201 Beiträge

15.10.2012 - 10:17 Uhr

Hallo,

ich habe zufällig auch mit dem Bereich zu tun.
Geht es dir ausschliesslich um Siemens oder meinst du SPSen allgemein?
Man könnte sicherlich bei fast jeder SPS (z.B. CODESYS) ein entsprechende Benachrictigung bei Änderung eines Eingangssignals o.ä. über ein Kommunikationssystem deiner Wahl (OPC, Modbus, TCP/IP, UDP, ...) senden. Aber ich denke das muss dann zumindest in der SPS-Applikation realisiert werden. Dann musst du dich nur noch für den Übertragunsweg entscheiden und in der C#-Applikaiton auf die Benachrichtigung lauschen.
Oder denkst du da an was anderes?

04.07.2012 - 11:31 Uhr

Hallo,

nachdem ich alles ausprobiert habe aber nichts half, war ich doch gezwungen den Rechner komplett neu aufzusetzen. Jetzt geht es wieder.
Trotzdem wäre es hilfreich zu wissen, woran es gelegen hat. Nur für den Fall, dass das Problem nochmal auftauchen sollte.
Also falls jemand eine Idee hat, oder das gleiche Problem schonmal hatte, gebt hier Bescheid.
Gruß

02.07.2012 - 14:11 Uhr

Hallo,

ich habe seit ca. einer Woche das Problem, dass Visual Studio 2008 nicht mehr kompilieren kann, nachdem ich eine neue Klassendatei in ein bestehendes Projekt eingefügt habe.
Anstatt das Projekt zu kompilieren erscheint ein "Speichern"-Dialog in dem ich die Projektdatei speichern soll. Wähle ich die Projektdatei aus kommt die folgende Fehlermeldung:

Fehlermeldung:
"Fehler beim Speichern der Projektdatei "XYZ.csproj". This project object has been unloaded from the MSBuild engine and is no longer valid."

Auch beim Schliessen der Umgebung kommt diese Meldung und ich kann das Projekt nicht speichern. Bearbeite ich allerdings die Projektdatei mit einem Text-Editor, kann ich die neue Klasse menuell einfügen und dann auch das Projekt wieder in VS2008 öffnen und normal kompilieren. Aber eben nur wieder solange, bis ich in VS eine neue Komponente ins Projekt einfüge.
Bei mehreren Projekten in der Solution tritt der Fehler nur in dem Projekt auf, das ich geändert habe.
Ich nutze Visual Studio 2008 Professional und programmiere in C#, das Betriebssystem in Windows 7, 32Bit.
Es scheint mir so zu sein, dass das Problem auftrtitt seit ich testweise VC#2010 Express installiert habe, sicher bin ich mir aber nicht.

Ich habe schon alles versucht, was mir einfällt.

  • VS2010 deinstalliert und bereinigt
  • VS2008 und alle .NET-Framework-Versionen neu installiert bzw. repariert
  • alles mögliche ergoogelt und ausprobiert (z.B. Zurücksetzen aller VS2008 Einstellungen)

Auch wenn ich neue Projekt erstelle tritt das Problem auf, sobald ich das erste mal eine neue Klassendatei hinzufüge und dann kompilieren will.
Ich hoffe es hat noch jemand eine Idde, die nicht mit Formatieren des Rechners zu tun hat?

MfG

26.04.2012 - 09:02 Uhr

"FlowLayoutPanel"
um die Liste zu erweitern.

In deinem Fall, dass ein Button unter Text vriabler Länge "klebt" würde ich

  • ein FlowLayoutPanel auf Vertical stellen
  • das Label mit dem Text auf AutoSize
  • Label und Button ins FlowLayoutPanel
    ->Fertig.
12.04.2012 - 13:03 Uhr

Meinst du vielleicht die DLR?

23.02.2012 - 11:18 Uhr

Hallo Sm|_|,

Ich habe bei einem meiner Projekte ein ganz ähnliches UI für die Kommunikation über serielle Schnittstellen. Ich habe ebenfalls ein UserControl erstellt, was je nach Auswahl in einer ComboBox die Daten des ausgewählten Ports anzeigt, das ist also meiner Meinung nach der richtige Weg um so etwas komfortabel zu lösen.

Um das ganze in ein Usercontrol auszulagern würde ich empfehlen die Controls im Designer aus der Form auszuschneiden und im Designer des usercontrols einzufügen. Leider muss man danach aber die Eventhandler neu erstellen, oder eben die Methoden ebenfalls rüberkopieren und neu zuweisen.

edit:
Ich nutze VS 2005...

hat es einen bestimmten Grund,dass du VS2005 nutzt?
Grade für eine akademische Abschlussarbeit wäre es doch bestimmt besser aktuelle Technik einzusetzen, oder? (nur so am Rande)

Viel Erfolg

21.02.2012 - 09:46 Uhr

Du könntest einfach mit einem Timer nach ein paar sekunden noch einmal versuchen den Port zu öffnen.
Und das notfalls so oft, bis es schließlich klappt.

21.02.2012 - 08:21 Uhr

Hallo,

sorry, dass ich jetzt erst daruf antworte, ich kam erst heute morgen wieder dazu nach der Sache zu schauen. Ich habe das Problem aber schließlich doch noch gefunden und beseitigen können.
Ein anderer Thread war es nicht. Das hätte mich auch gewundert, denn das sollte ja durch das lock-Statement abgefangen sein.

Ich konnte es jetzt soweit zurückverfolgen, dass ich an den Anfang und das Ende von fetchSettings() je einen Breakpoint gesetzt habe.
Beim 1. Aufruf der Methode wurde der Breakpoint am Anfang schon das 2. mal erreicht, bevor der Am Ende das erste mal erreicht wurde.
Da musste also irgendwo der Haken liegen. Ich habe dann herausfinden können, dass durch "irgend"ein event in der Rahmenanwendung das durch das 'fetchen' der settings ausgelöst wird, eine andere Komponente von mir dazu gebracht wird, die Methode GetSettings() nocheinmal aufzurufen. Der 2. Aufruf kam also aus dem selben Thread und geschah (wenn auch indirekt) innerhalb des 1. Aufrufes.
Allerdings nur beim 1. mal, so dass keine endlose Rekrsion entstand. Durch das weiterleiten über mehrere events war der StackTrace aber so unübersichtlich, dass man gar nicht mehr sehen konnte, dass die Aufrufe ineinander geschachtelt waren, man sah nur noch graue DynamicInvoke- und Invoke-statements im StackTrace-Fenster. Jedenfalls konnte ich dadurch, dass ich meinen anderen EventHandler erst zu einem späteren Zeitpunkt registriere, das Problem beheben.

Vielen Dank für eure Tipps, die den Denkanstoß für die Suche in die richtige Richtung gegeben haben!

20.02.2012 - 11:07 Uhr

Hallo herbivore,

das kann dann sein, wenn das Objekt, das von _cache referenziert wird, beim zweiten Aufruf ein anderes ist.

Ist nicht der Fall. Das objekt wird nur einmal erzeugt und zugewiesen:


private Dictionary<ushort, ISettings> _cache = new Dictionary<ushort, ISettings>();

Oder wenn executingMethod außerhalb der Methode vor dem ersten Aufruf auf true gesetzt wird.

Ist nicht der Fall. Die variable habe ich nur zum testen eingeführt und sie wird nirgends sonst außer an den gezeigten Stellen verwendet.

Bau ein Projekt, dass nur den absolut nötigen Code enthält. Ersetze dass Fetch durch eine leere (Warte-)Schleife.

Das werde ich jetzt machen.
Sehr merkwürdig alles...

20.02.2012 - 10:29 Uhr

So, das habe ich jetzt auch mal gemacht. Beim überprüfen des StackTrace ist aber auch nichts weiter herausgekommen, als vorher. Add wird immer nur aus der Mehtode heraus aufgerufen, die ich schon gepostet hatte. Im StackTrace den ich in der Add()-Methode bekomme ist fetchSettings() NICHT enthalten.
Aber was mich stutzig gemacht hat:
Wenn ich in der Methode Add (oder auch außerhalb, also in die Zeile, wo Add aufgerufen wird) einen Brakpoint setze, sehe ich, dass die Zeile fetchSettings(id) darüber grau hinterlegt ist, also offenbar gerade ausgeführt wird. Allerdings ist sie wie gesagt nicht im aktuellen StackTrace enthalten. Also wird sie wohl in einem anderen Thread gerade ausgeführt.

Um das zu überprüfen habe ich mal testweise folgendes Konstrukt eingefügt:



private bool _executingMethod = false;

public ISettings GetSettings(ushort id)
{
  lock (_cache)
  {
     try
     {
       if (_executingMethod)
       {
         throw new Exception("This is not possible !!!"); //diese Stelle wird erreicht!
       }
       _executingMethod = true;
    
       //hier steht wieder der normale Methoden-Inhalt
       //(zur Übersichtlichkeit weggelassen)
       ...

     }
     finally
     {
       _executingMethod = false;
     }
  }
}

Das mag etwas merkwürdig aussehen, aber es zeigt anhand der Stelle mit der Exception dass die Methode 2x parallel ausgeführt wird.
Das kann nach meinem Verständnis nicht sein, wenn mittels lock() synchronisiert wird, oder?

20.02.2012 - 09:41 Uhr

Es ist in diesem Fall schon recht trivial.
Aber ich versteh nicht, wieso Du nicht einfach die Dinge machst, die man Dir empfiehlt; zB MrSparkle.
Lieber erfindest das Rad neu..?

Sorry, das hatte ich nicht erwähnt. Das hatte ich vorher schon gemacht.

Der StackTrace zeigt mir, dass die Methode von 2 auf dem GUI sichtbaren Elementen aufgerufen wird. Es gibt keine Stelle (außer der geposteten) an der das Dictionary verändert wird.

Zudem die Aussage von herbivore

irgendeine der von dir getroffenen Annahmen wird falsch sein. Sonst würde keine Exception kommen.

Ich bezweifel, dass es ein hochkomplizierter und nicht nachvollziehbarer Fehler ist.

Das sehe ich eigentlich genauso. Darum habe ich meine Aussagen ja auch mehrmals überprüft. Dummerweise bin ich mir mittlerweile ziemlich sicher, dass sie tatsächlich stimmen. Das verwirrt mich umso mehr.

Dann wärs doch ne Idee das ganze mal zu debuggen und zu schauen, was im Dictionary drin steht wenn CntainsKey aufgerufen wird (das dann false zurückliefert?) und was drin steht wenn der Eintrag nochmal geschrieben werden soll.

Das habe ich auch getan. Wie erwartet, ist der Inhalt zunächst leer, in dem Moment, wo der Wert geschrieben werden soll, aber nicht.

Ich werde wohl mal deinen Vorschlag angehen ein eigenes Dictionary abzuleiten und darin zu debuggen. Mal sehen, was das ergibt

20.02.2012 - 08:16 Uhr

Hallo,

erstmal Vielen Dank für die vielen Antworten.
Zuerst dachte ich, ich hätte eine ganz blöden Fehler gemacht, aber die weiteren Beiträge haben dann ja gezeigt, dass es doch nicht so trivial zu sein scheint.

@T-Virus:
Ja, der Code ist nur schnell nachgetippt und auf die relevanen Stellen beschränkt. Alles andere (aufrufende Klassen etc) wäre zu unübersichtlich und spielt auch keine Rolle.
Die relevanten Teile sind wirklich alle enthalten. Einen zweiten Aufruf an irgendeiner anderen Stelle, an der etwas ins dictionary gepackt wird o.ä., gibt es nicht. Das habe ich mit der Symbolsuche mehrmals überprüft. Das Dictionary bearbeitet niemend sonst.

Ich finds seltsam dass innerhalb der paar wenigen Instruktionen (bis auf die Methode fetch...) so oft "irgendjemand" die ID einfügen kann, dass es hier öfter zu Problemen kommt.
Mach die Abfrage mit dem Contains nochmal nach dem fetch und zähl wie oft das vorkommt.

Es ist noch seltsamer.
Es ist nämlich so, dass gar nicht viel passiert, bis der Fehler auftritt. Die Methode wird einmal aufgerufen, dann wird richtigerweise der erste Eintrag erstellt.
Gleich beim 2. Aufruf tritt dann der Fehler auf. Danach aber nie wieder.

Das einzige, was mir noch einfällt, was evtl interessant sein könnte, ist dass die methode fetchsettings() beim 1. Aufruf u.U. länger braucht, als bei den späteren Aufrufen, da sie ihrerseits auf eine andere Resource zugreift, die beim 1. Aufruf initialisiert werden muss.

Ich werde gleich mal versuchen das Problem mit einem kleinen eigenständigen Tool nachzustellen, ohne das ganze Framework was hier noch drumherum ist.

17.02.2012 - 14:40 Uhr

Halllo,

ich habe gerade ein merkwürdiges Problem beim Zugriff auf ein Dictionary, das ich als Cache nutzen möchte um eine bestimmte Operation nicht unnötigerweise mehrmals ausführen zu müssen, wennn das Ergebnis schon bekannt ist.
Der Zugirff auf den Inhalt des dictionaries kann aus mehreren Threads erflgen, darum habe ich das ganze in ein lock() gepackt um Inkonsistenzen zu vermeiden. Sowohl die Abfrage, ob der Schlüssel schon vorhanden ist, als auch das Einfügen des Schlüssel-Wert-Paares stehen innerhalb des lock-Statements:


   private Dictionary<uhsort, ISettings> _cache = new Dictionary<ushort, ISettings>();
   private readonly object SEMAPHORE = new object();

    public ISettings GetSettings(ushort id)
    {
      lock (SEMAPHORE)
      {
        if (_cache.ContainsKey(id))
        {
          return _cache[id]; //return cached result
        }
        else //not yet in cache
        {
          ISettings result = fetchSettings(id); //add new entry to cache

          _cache.Add(id, result); //ArgumentException occurs here! (key already existing)
          return result;
        }
      }
    }

Trotzdem tritt beim Einfügen neuer Einträge manchmal eine ArgumentException auf:> Fehlermeldung:

An item with the same key has already been added.

Es wird an keiner anderen Stelle auf das Dictionary zugegriffen, auch das lock-object wird nirgends sonst verwendet.
Kann mir jemand erklären, wie das sein kann? Habe ich die Arbeitsweise von lock() doch nich nicht richtig verstanden?

Danke!

16.02.2012 - 08:31 Uhr

sollte mit


DataGridView.FirstDisplayedCell

gehen, wenn ich mich nicht irre

20.01.2012 - 13:13 Uhr

Hallo,

hat jemand von euch das Resource Refactoring AddIn unter einem deutschen Visual Studio 2008 unter Windows 7 am laufen?
Bei mir funktioniert es nicht, es wird zwar nach der Installation im AddIn-Manager angezeigt, aber der Menübefehl "Extracct to Resource" wird bei einem Rechtsklick auf einen String nicht angezeigt.
Auch im "Anpassen"-Dialog erscheint er in keiner Kategorie.
Auf meinem alten Rechner (ebenfalls VS2008, aber Windows XP) funktionierte das einwandfrei.
Andere AddIns (GhostDoc, VSBuildStatus, ..) funktionieren auch.

Weiß jemand Rat?

Danke!

17.01.2012 - 14:55 Uhr

Hallo ironnie,

meiner Meinung nach ist das genauso gedacht. Mehrere Instanzen wären unnötiger Overhead.
Wenn du den Tooltip im Designer einfügst und bei jedem Control einen Text eingibst, geschieht im *.Designer.cs-File genau das gleiche, wie du hier geschrieben hast.
Das selbe gilt auch für ErrorProvider.

Gruß

02.01.2012 - 12:09 Uhr

Hallo,

nein, das geht nicht.
Als Parameter können nur Objekte (also Instanzen von Klassen oder Werttypen) übergeben werden.
Was möchtest du denn damit erreichen?
Wenn es darum geht, dass innerhalb der Methode bestimmte andere Methoden einer bestimmten statischen Klasse aufgerufen werden sollen, kannst du das evtl auch mit Delegaten (also quasi Zeiger zu den gewünschten Funktionen) lösen.
Alternativ kannst du die Klasse auch nicht-statisch machen und eine Singleton-Instanz deiner Klasse übergeben.

Gruß

01.12.2011 - 09:43 Uhr

Im SplitContainer gibt es die Eigenschaft 'Panel1MinSize', vielleicht kannst du damit was anfangen?
Ansonsten das SplitterMoving-event abbonieren und bei Bedarf das Flag Cancel=true setzen.

28.11.2011 - 13:01 Uhr

Gern geschehen.

Dann ist sogar

ParentMenu.DropDown.AutoClose = false;  

der wohl noch einfachere Weg.

Stimmt, allerdings kannst du es mit meiner Variante auch von einzelnen Menüpunkten abhängig machen. Manchmal kann das auch praktisch sein.

28.11.2011 - 12:16 Uhr

Hallo,

auch wenn das Thema glaube ich schonmal besprochen wurde, ich habe es in etwa so gelöst:

Für alle Items, die das Menü nicht schliessen sollen, dass Closing-event registrieren und so implementieren:


    private void menuItem_Closing(object sender, ToolStripDropDownClosingEventArgs e)
    {
      e.Cancel = e.CloseReason == ToolStripDropDownCloseReason.ItemClicked;
    }

08.11.2011 - 10:31 Uhr

Da hast du recht, ich merke auch grad, dass ich den Satz sogar falsch verstanden hatte, weil ich ihn nur überflogen habe.
Nicht "module B" ist irrelevant, sondern "the fact...".

Aber der Sinn bleibt der gleiche: Ein Wrapper ist nicht zulässig, bzw. kann die Auswirkungen der GPL-Lizenz auf weitere proprietäre Programmteile nicht einschränken.

08.11.2011 - 10:18 Uhr

Auf so ein Beispiel antwortet die GPL-FAQ (glaube ich) auch:

http://www.gnu.org/licenses/gpl-faq.html#GPLWrapper

[...]module B is legally irrelevant

08.11.2011 - 08:38 Uhr

Ich kann zu dem auch nicht glauben, dass nur weil eine dritte Person ein Plugin zu meiner Anwendung schreibt ich deren Lizenz ändern müsse. - Woher soll ich denn auch erfahren, dass Max Muster dies getan hat, wenn ich weder direkt noch indirekt Kontakt mit ihm habe?

Die GPL-FAQ sagt doch wörtlich:

if the program uses only simple fork and exec to invoke and communicate with plug-ins, then the plug-ins are separate programs [...] If the program dynamically links plug-ins, and they make function calls to each other and share data structures, [...] In order to use the GPL-covered plug-ins, the main program must be released under the GPL or a GPL-compatible free software license

Wenn man also PlugIns für ein Framework schreibt, dass Dependency Injection oder ähnliche Mechanismen verwendet, kommt man in die Bredouille, dass man das Hauptprogramm unter GPL (oder kompatible Lizenz) stellen müsste um GPL-Libs für ein PlugIn zu verwenden. wenn man das aber nicht tun kann, da das Hauptprogramm anders Lizenziert ist, steht man in einer Sackgasse und kann die schöne GPL-Komponente leider nicht verwenden.

die Klarstellung "Free as in Freedom" ist nur im Englischen nötig, denn wo die Engländer nur das Wort free haben, gibt es im deutschen frei und kostenlos.

Das ist mir klar, ich meinte damit nur, dass man als Anwender in der Benutzung der GPL-Bibliotheken keinesfalls frei ("wie in Freiheit") ist, da man schließlich einiges beachten muss. Ich muss zugeben, dass ich mich bisher nicht tiefgehender mit der GPL beschäftigt habe (ich war nur mit der LGPL in Berührung gekommen). Darum war mit die Tragweite und - vor Allem - der virulente Character nicht bewusst.

Du wirst also damit leben müssen, den Willen der Autoren zu respektieren, egal welche Lizenz sie verwenden.

Selbstverständlich. Aber schade ist es trotzdem 😉

07.11.2011 - 16:39 Uhr

Interessanter Gedanke, vorallem in Bezug auf Anwendungen die Plugin-Systeme beinhalten.

Wenn ein Nutzer der Anwendung ein Plugin schreibt, was auf eine GPL Bibliothek zugreift kann ja keiner vom Entwickler verlangen seinen Source offen zu legen. Lediglich das Plugin selbst müsste dann aus meiner Sicht unter die GPL gestellt werden.

Auf der GNU-Website habe ich dazu diese Infos gefunden:

http://www.gnu.org/licenses/gpl-faq.html#GPLWrapper
http://www.gnu.org/licenses/gpl-faq.html#GPLAndPlugins
http://www.gnu.org/licenses/gpl-faq.html#NFUseGPLPlugins

Es scheint also tatsächlich so zu sein, dass man dann den Code des gesamten System offenlegen müsste. Also auch den der Kern-Komponente und aller PlugIns.
Je mehr ich mich mit der GPL beschäftige, desto mehr bekomme ich den Eindruck, dass der Slogan "Free as in Freedom" (-> siehe hier) nicht wirklich passt.
Denn der "virale" oder "virulente" Character der Lizenz (auch wenn GPL-Anhänger das wohl nicht hören wollen), schränkt die Nutzung (und damit auch die Verbreitung der GPL-Software) wirklich deutlich ein. Vor Allem, wenn bei größeren Projekten andere Parteien mit anderen Lizenz-Modellen involviert sind.

07.11.2011 - 15:01 Uhr

Hmm, dann ist es doch so wie befürchtet.
Dann werde ich darauf wohl verzichten müssen.
Es geht um ILNumerics.Net. Die Haupt-Bibliothek steht unter LGPL, aber ILNumerics.Drawing steht leider unter GPL.
Evtl. kontaktiere ich den Autor auch mal direkt.
Danke schonmal für die Antworten.

07.11.2011 - 14:38 Uhr

In anderen Threads wurde ja schon reichlich über GPL-Lizenzen diskutiert. Ich habe aber trotzdem nochmal eine konkrete Frage.
In GPL in Teilen meines Softwaresystems ist ja die Rede davon, dass man die GPL-Komponent quasi "kapseln" kann und sie nur noch 'indirekt' verwendet.

Ich stehe gerade vor dem Problem, dass ich gerne eine GPL-V3-Lizenzierte Bibliothek in einer kommerziellen Software einsetzten möchte.
Natürlich kann ich nicht den Quellcode des gesamten Projektes offenlegen. Nicht zuletzt, weil darin auch verschiedene 3rd-Party Komponenten verwendet werden, zu schützendes Know-How darin steckt usw, usw...

Die Struktur sieht so aus, dass ich eine DLL habe, welche intern wiederum Klassen aus der GPL-Bibliothek verwendet. Diese DLL kapselt sozusagen die Verwendung der GPL-Komponente. Alle anderen Komponenten verweisen nur auf diese DLL und nicht direkt auf die GPL-Bibliothek. Es wäre kein Problem diese eine von mir entwickelte DLL mit dem direkten Verweis auf die GPL-Lib auch unter GPL zu stellen und den Source-Code zu veröffentichen, aber das dürfte sich natürlich nicht auf das gesamte Projekt auswirken.
Wenn ich die GPL richtig verstanden habe, müsste ja wiederum jede Komponente, die meine eigene GPL-Bibliothek verwendet, auch wieder unter GPL stehen. Aber gibt es da nicht eine Grenze, bzw. Ausnahme, da ich ja Autor und Rechteinhaber dieser Komponente bin?

Kann das so funktionieren und wäre das rechtlich (eurer Meinung nach) in Ordnung?

P.S.: Ich weiß natürlich, dass hier niemand rechtlich verbindliche Einschätzungen geben kann, aber eine Diskussion und Meinungsaustausch zum Thema wäre trotzdem hilfreich.

04.11.2011 - 08:55 Uhr

Hallo,

ich wollte nochmal kurz Rückmeldung geben.
ILNumerics.Net ist ziemlich genau das, was ich gesucht habe.
Gratis, OpenSource, jede Menge Funktionen und gute Dokumentation.

Lustig ist, dass das Beispiel-Bild, das ich oben angehängt habe, offenbar auch damit erstellt wurde, was ich vorher nicht wusste 😉

Damit kann man z.B. wunderbar mit wenigen Zeilen eigenem Code einen Funktionsplotter erstellen.

Danke!

03.11.2011 - 09:56 Uhr

Hallo dN!3L,

das sieht viel-versprechend aus. Ich werde mal ausprobieren, wie weit ich damit komme.
Danke schonmal!

03.11.2011 - 09:19 Uhr

Hallo,

kennt jemand von euch eine gute OpenSource-Bibliothek, mit der man 3D Graphen plotten kann?
Also in etwa wie das angehängte Bild.

Es sollte möglichst nicht auf WPF basieren, da ich damit noch keine Erfahrung habe.
In den einschlägigen Quellen (z.B. Code Project) habe ich leider nichts brauchbares gefunden.

Gruß

19.10.2011 - 10:06 Uhr

Ich habe eine Lösung gefunden, aber das ist wohl eher ein Workaround:

  • Visual Studio beenden
  • alle 'bin' und 'obj' Ordner in der Solution löschen
    (ich war bisher immer davon ausgegangen das der Inhalt dieser Ordner durch "Bereinigen" gelöscht wird, aber das ist offenbar nicht so)
  • Solution wieder öffnen
  • Neu Erstellen

-> umbenanntes Control kann ganz normal verwendet werden.

Aber vielleicht hat ja jemand noch eine einfachere Variante (oder vielleicht sogar eine Erklärung dafür) ?

19.10.2011 - 09:33 Uhr

Hallo Community,

ich habe ein Problem im VS2008-Forms-Designer.

Und zwar kann ich nach dem umbenennen des Typs eines meiner eigenen Controls (welches sich in einem eigenen Projekt befindet, die DLL wird signiert und in den GAC installiert) genau dieses Control nicht mehr im Designer hinzufügen.

Die Fehlermeldung, wenn ich es aus der Toolbox auf eine Form ziehe, lautet:
"Fehler beim Laden von Toolboxelement "MyTestControl". Es wird aus der Toolbox entfernt."

Bereinigen und neues Erstellen aller beteiligten Projekte habe ich schon probiert, hilft aber leider nicht.

Die Forumssuche hat das hier gebracht:
Fehler beim Laden von Toolboxelement

Allerdings nutze ich keine enum in meinem Control.

Ich habe es mittlerweile soweit herunterbrechen können, dass mein Control nur noch den folgenden Code enthält:


  public class MyTestControl : Control
  {
    protected override void OnPaint(PaintEventArgs e)
    {
      e.Graphics.FillRectangle(Brushes.Aquamarine, e.ClipRectangle);
    }
  }

Zum einfacheren nachvollziehen habe ich mal die ganze Solution angehängt.

Zum reproduzieren muss man lediglich den Control-Typ von "MyTestControl" in zB. "MyTestControl2" umbenennen und dann versuchen eine Instanz davon im Designer einer Form hinzuzufügen.
Hat man vorm umbenennen schon eine Instanz zur Form hizugefügt kann man die Form nicht mehr öffnen und es erscheint die Meldung:
"Der Typ Test.MyTestControl wurde nicht gefunden. Stellen Sie sicher, dass auf die Assembly, die diesen Typ enthält, verwiesen wird. Wenn dieser Typ Teil Ihres Entwicklungsprojekts ist, stellen Sie sicher, dass das Projekt erfolgreich generiert wurde. "

Die Meldung hilft mir allerdings nicht weiter, denn die Assembly ist Teil der Solution, ist ordnungsmegäß referenziert und wurde auch erstellt.
Ausführen lässt sich das Projekt auch, und das Control wird angezeigt. Nur im Designer gibt es Probleme.

Auch Google hat mir nur die gleichen Tips gebracht, wie die Fehlermeldungen, nichts davon hilft.

Wenn ich den ursprünglichen Typnamen wieder herstelle, funktioniert es wieder.
Kommt mir fast so vor, als würde das .NET-Framework das irgendwo cachen oder so.
Hat jemand eine Idee, wie ich das Control mit dem neuen Typ-Namen zum funktionieren bekomme?
Es muss doch möglich sein den Typ eines Controls nachträglich umzubennen.
Oder übersehe ich irgendwas?

MfG

28.09.2011 - 08:14 Uhr

Hallo Taladen,

ich mache das (wie gfoidl schon angedeutet hat) mit bedingter Kompilierung.

Dazu muss (in VS) in den Projekteigenschaften unter "Erstellen" der Haken bei "DEBUG Konstante definieren" gesetzt sein.

Die kannst du dann im Code z.B. so verwenden:


#if DEBUG
 string fileName = "Data_Debug.txt";
#else
 string fileName = "Data.txt"
#endif

26.09.2011 - 12:19 Uhr

Hallo herbivore

Selbst wenn man - mit mit etwas Mühe - sechs Ebenen "verbrannt" hat,...

Ich denke dass man sich dafür in einer komplexeren Anwendung nicht viel Mühe geben muss.

...hat man immer noch locker und komfortabel vier weitere Ebenen. Wie schon gesagt, in der Praxis sollte das ausreichen. Wenn du wirklich mal einen konkreten praktischen Fall hast, bei dem du wie du es auch drehst und wendest nicht unter 10 Ebene kommst, können wir weiter reden.

Da gebe ich dir völlig recht. Ich habe bisher auch keinen Einsatzfall, wo ich auf 10 Ebenen komme.
Allerdings bin ich auch nicht so weit davon entfernt, dass ich es für alle Zeiten ausschließen kann.

Darum hatte ich gefragt, wovon die Grenze abhängt, da der Test bei mir ja auch 47 ergibt. Und das reicht 100%ig für alle vorstellbaren sinnvollen Anwendungsfälle aus.

26.09.2011 - 08:53 Uhr

ok, habs probiert: 47 😉

Mich hat das Thema auch mal ineteressiert, darum habe ich den Test auf meinem Rechner auch mal laufen lassen.
Bei mir sinds auch 47 Ebenen. Ist das jetzt ein generell gültiger Wert für .NET/WinForms oder hängt das vom RAM oder sonst irgendwas ab?
Bei Floschi z.B. scheint das Maximum ja schon bei 10 zu liegen, was ich für knapp bemessen halte. Man stelle sich mal vor, man hat eine Rahmenanwendung (1) mit einer DockingSuite (2), die evtl auch noch Panels enthält (3), packt da ein TabControl rein (4) und auf eine TabPage (5) tut man seine eigenen UserControls (6), die irgendwelche schönen Dinge anzeigen. Dann hätte man da bei einem Maximum von 10 ja gerade mal 4 Ebenen zur freien Verfügung.
Wenn 47 die Grenze ist, gebe ich euch recht, da wird man wohl nie hinkommen, zumindest würde das GUI dann auch sehr merkwürdig aussehen 😉

26.07.2011 - 12:49 Uhr

ein Control kann sich auch von Parent zu Parent hangeln, bis es beim Form angekommen ist

Dafür gibt es doch auch Control.FindForm() oder?

Gruß

12.07.2011 - 07:50 Uhr

ZedGraph (OpenSource-Bibliothek) könnte für dich interessant sein.
Das unterstützt jedenfalls CandleSticks, Pies, Bars, Lines, ...
Google einfach mal danach

07.07.2011 - 14:49 Uhr

Lass doch den designer machen, was er will und du ändest die Werte einfach in deiner Klasse nachträglich.

Entweder im Konstruktor, oder im Load-event oder eben beim ändern der relevanten variablen

01.07.2011 - 10:55 Uhr

Auch wenn das eigentlich zu Grundalgen gehört, probiers doch mal so:


public class SettingsCache
{
  private static SettingsCache _singleton = new SettingsCache();
  
  private SettingsCache() //hide constructor
  {}

  public static SettingsCache SINGLETON
  {
    get
    {
      return _singleton;
    }
  }  

  //Methoden hier einfügen....
}

und dann so auf das Singleton zugreifen, anstatt eine neue Instanz zu erstellen:


SettingsCache.SINGLETON.IrgendEineMethode();

01.07.2011 - 09:39 Uhr

Hallo,

Gibt es hier bekannte Schwierigkeiten? Muss ich noch mehr "von
Hand" aufräumen? Oder vermutet ihr ein Treiber Problem?

Ich vermute eher ein Problem mit dem Treiber, denn bei mir funktioniert das mehrmalige schließen und wieder öffnen des Ports ohne Probleme unter Win7 (64Bit) und ich habe ebenfalls einen USB/Serial Converter (von FTDI).

Hast du denn einen OnBoard-Port verfügbar mit dem du testen kannst, oder einen anderen Wandler?

Gruß

01.07.2011 - 09:36 Uhr

Hallo,

Dem Debugger scheint es auch nicht möglich zu sein beim Konstruktor des Singletons zu stoppen damit ich schauen könnte wer diesen aufruft.

Merkwürdig, aber du könntest statt der Thread-ID ja mal den StackTrace im Konstruktor ausgeben:


System.Diagnostics.Debug.WriteLine(new System.Diagnostics.StackTrace().ToString());

29.06.2011 - 09:51 Uhr

Weiteres Problem: Wenn ich meinen Chef nicht davon überzeugen kann für eine .NET SPS etwas Geld auszugeben, ja sowas gibts, dann darf ich das ganze in Structured Text machen.

Dann wirds SEHR SEHR viel if,elseif, else werden unglücklich

Das Thema mit der .NET-SPS würde mich mal interessieren. Wo gibts denn sowas und wie soll das mit der Echtzeitfähigkeit aussehen?

Und zu Structured Text: In IEC 61131-3 ist ST objektorientiert. Das heißt, du kannst Klassen, Schnittstellen, Vererbung und alle solche tollen Dinge verwenden. Also brauchst du damit genausoviel oder wenig if/elseif/else wie mit C# auch.

Gruß

31.05.2011 - 11:32 Uhr

Den Versuch, die Software 100%ig vor Crackern schützen zu wollen, habe ich aufgegeben. Das ist ein Kampf, den man definitiv nicht gewinnen kann. Man kann es dem Cracker schwer machen (z. B. mit Anti-Debugging Techniken), aber ein erfahrener Cracker lässt sich davon nicht abhalten.

Da gebe ich dir recht.
Man muss sich aber auch einfach darüber im Klaren sein, dass niemand Tage oder Wochen an Arbeit in einen Crack investieren wird für eine Software, die vielleicht 50€ kostet. Darum sollte man den Aufwand eben auch immer in Relation zum zu schützenden Wert sehen.

Gruß,
DF

25.05.2011 - 12:28 Uhr

Hast du ein PropertyGrid in deiner Anwendung oder meinst du das VS Property-Grid?
In deiner Anwendung wirst du die Anzeige selber machen denke ich. Möglich, dass im VS einfach noch ein Panel darunter ist, das die Description anzeigt.

13.05.2011 - 09:03 Uhr

@Beatsteak: Super, Danke!

So funktioniert es:


(07|08|09|10)

@TheGear: Dein Ausdruck würde ja beliebige 2-stellige Ziffern matchen, das will ich aber nicht.

13.05.2011 - 08:24 Uhr

Hallo,

ich habe gerade ein kleines Problem:
Ich brauche einen Regulären (Teil-)Ausdruck, der exakt auf eine der folgenden Zeichenfolgen passt:

07
08
09
10

und sonst auf keine!

Ich habe es versucht mit: [07,08,09,10]
Der Ausdruck erkennt zumindest schonmal die 4 strings korrekt. Aber er erkennt auch noch andere. Zum Beispiel wird die 0 aus 06 oder 0x ebenfalls gematcht.
Was muss ich machen, damit die Zeichenklasse, genau 2 Zeichen matcht?
Ich habe schon diese Ausdrücke versucht, aber ohne Erfolg:
["07","08","09","10"]
[(07),(08),(09),(10)]

aber die verhalten sich genauso...

Danke!

Gruß

12.05.2011 - 12:01 Uhr

  public abstract class BaseClass<T>
  {
    public T Value { get; set; }
  }


  public class Implementation : BaseClass<string> //<T> legt den typen beim erben fest
  {
    public Implementation()
    {
      Value = "abc";
    }
  }

12.05.2011 - 08:09 Uhr

Ich habe mir für den Fall vor ein paar Monaten mal zwei praktische Methoden gebastelt:



    /// <summary>
    /// Converts an arbitrary object to an XML-string
    /// </summary>
    /// <typeparam name="T">The type of object to convert.
    /// NOTE: The type must be XML-serializable!</typeparam>
    /// <param name="obj">The object to convert</param>
    /// <returns>The XML-string</returns>
    public static string XMLSerializeToString<T>(T obj)
    {
      XmlSerializer xser = new XmlSerializer(typeof(T));
      StringBuilder sb = new StringBuilder(string.Empty);
      StringWriter sw = new StringWriter(sb);

      XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces();
      xmlnsEmpty.Add("", "");

      xser.Serialize(sw, obj, xmlnsEmpty);

      return sb.ToString();
    }

    /// <summary>
    /// Deserializes an XML-string to an object of a given type
    /// </summary>
    /// <typeparam name="T">The type of the object</typeparam>
    /// <param name="s">The XML-string (must be valid XML and applicable to the type!)</param>
    /// <returns>The de-serialized object</returns>
    public static T XMLDeserializeString<T>(string s)
    {
      XmlSerializer xser = new XmlSerializer(typeof(T));
      StringReader sr = new StringReader(s);

      T result = (T)xser.Deserialize(sr);
      return result;
    }


Vielleicht kannst du das gebrauchen...

Gruß

06.05.2011 - 13:40 Uhr

Hallo zusammen,

ich bin momentan auf der Suche nach einem guten Buch zum Thema "IronPython".

Bei Amazon finde ich z.B.:

  • Pro IronPython
  • IronPython in Action
  • Professional IronPython

Kann mir vielleicht jemand eins dieser Bücher (oder ein anderes) empfehlen?

Es sollte zum Einen ein bisschen auf Python generell eingehen und zum Anderen die Anbindung an .NET und die Implementierung erklären (Stichwort: DLR).

Danke!

Gruß

29.04.2011 - 08:09 Uhr

Ich denke das ist "Geschmackssache", aber die Argumente von Grumbler85 sind gut.
Ich mache es jedenfalls auch immer ungefähr so.

23.11.2010 - 08:06 Uhr

Ich nehme an, dass ich das AssemblyResolve Event woanders hinterlegen muss?
Amosius

Denke ich auch, denn im Artikel steht ja:

when your application initializes, register a callback method with the AppDomain’s ResolveAssembly event

Darum würde ich es mal so probieren (nicht im Window, sondern in der Application):


  /// <summary>
  /// Interaktionslogik für "App.xaml"
  /// </summary>
  public partial class App : Application
  {
    public App()
    {
      AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
      {
        String resourceName = "AssemblyLoadingAndReflection." +
           new AssemblyName(args.Name).Name + ".dll";

        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
        {
          Byte[] assemblyData = new Byte[stream.Length];
          stream.Read(assemblyData, 0, assemblyData.Length);
          return Assembly.Load(assemblyData);
        }
      };
    }
  }

Gruß