Laden...

Forenbeiträge von BenjaminB82 Ingesamt 29 Beiträge

08.12.2014 - 11:04 Uhr

Um dir jetzt irgendwie helfen zu können, wäre es brauchbar, zumindest etwas Quellcode zu sehen.

Bist du denn schon so weit?


using (OdbcConnection odbcConnection = new OdbcConnection(connectionString))
{
            odbcConnection.Open();
            using(OdbcCommand odbcCommand = new OdbcCommand(sql, odbcConnection))
            {
                  // ....
            }
}

30.08.2013 - 16:43 Uhr

Unglaublich... ich habe es mehr durch Zufall als durch alles andere heraus gefunden.

Das Programm schreibt ein Protokoll, in dem ich eine Textdatei in das Verzeichnis des Webdienstes geschrieben habe.
Das führte offenbar dazu, dass die Appdomain zerstört wurde. Also den Logpfad auf ein anderes Verzeichnis umgelegt und schon ist alles so, wie es sein soll.

Im Nachhinein logisch... hätte ich das doch bloß eher ausprobiert ... 😉

29.08.2013 - 17:13 Uhr

Langsam bin ich echt am Verzweifeln. Ich habe nun alle Methoden aus dem Interface und der implementierenden Klasse geschmissen und nur noch eine Methode darin, die einen statischen Integer hochzählen soll. Wieder kein Erfolg. Es wird immer nur 1 zurück gegeben.

Hier ist meine Web.Config. Ist da vielleicht irgendwas drin, was böse ist?

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="Advis" maxBufferSize="2147483647" maxBufferPoolSize="2147483647"
          maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="osvhCsAdvisWcfService.DMSWebServiceSoap" behaviorConfiguration="MyServiceTypeBehaviors">
        <endpoint binding="basicHttpBinding" bindingConfiguration="Advis"
          contract="DMSWebServiceSoap" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors" >
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

29.08.2013 - 11:36 Uhr

Tja... Die Situation ist nach wie vor verrückt. Ich habe in den Static-Konstruktur ein Logging eingebaut. Jedes Mal wenn sich ein Client neu verbindet, wird der Static-Konstruktur neu aufgerufen.

Liegt es vielleicht daran, dass das Client-Objekt auf Client-Seite verworfen wird?

28.08.2013 - 22:09 Uhr

Danke. Ich werd das morgen einfach mal ausprobieren und meine Erkenntnisse posten.

28.08.2013 - 16:33 Uhr

Ja, ich habe dieses Dictonary eben nur für den Test eingebaut und es wird nur an der Stelle mit "new" bearbeitet, den ich in meinem vorherigen Posting gezeigt habe. Ansonsten wird es nur noch im Konstruktur verwendet, um ein neues Element einzufügen.

Kann's vielleicht irgendeine IIS-Einstellung sein?

28.08.2013 - 16:11 Uhr

Dazu brauchst du ja nur ein statisches Dictionary (bzw. ConcurrentDictionary) verwenden. Als Key den Ordner und als Value die Liste mit den Dateien. Das Dictionary ist dann der (einfache) Cache.
Sessions sind dazu nicht nötig, somit kannst du auch BasicHttpBinding verwenden.

Und das ist es, was ich nicht verstehe: Das Dictionary scheint bei jedem Aufruf des Dienstes neu instanziiert zu werden; auch wenn es als static markiert ist. Es wird lediglich beim Konstruktur ein neues Objekt reingeworden.


public class DMSWebServiceSoap : IDMSWebServiceSoap
    {
        private static ConcurrentDictionary<Guid, OsService> dictionary = new ConcurrentDictionary<Guid, OsService>();

Der Count ist jedoch immer wieder 1 ...

Ist bestimmt irgendein dummer Fehler meinerseits 😉

28.08.2013 - 15:16 Uhr

Danke für die schnelle Antwort!

Soll das Caching dann global für alle Anfragen (eines Ordners) die Dokumente vorhalten od. nur für den einen Client?

Od. wie kann ich mir das vorstellen?

  1. Anfrage auf Ordner -> holt im "Hintergrund" alle Dokumente und hält sie vor
  2. Anfrage für Dokumente -> liefert Dokumente aus dem Cache

Wenn das so wäre schau dir "Sessions" an.

Ich denke beides sollte möglich sein. Es kann durchaus sein, dass mehrere Clients das gleiche abfragen. Es soll dann entsprechend bei beiden gleich schnell laufen. Daher wäre es schon sinnvoll einmal geholte Objekte global zur Verfügung zu haben.

Über das Thema Sessions bin ich auch schon gestolpert. Aber da basicHttpBinding ja zustandslos ist, dachte ich bisher, dass dies nicht in Frage kommt. Da werde ich wohl was falsch verstanden haben?

28.08.2013 - 14:54 Uhr

Hallo allerseits,

ich habe ein Problem und habe trotz meiner Google-Recherchen nichts gefunden, was mich irgendwie meinem Ziel näher bringt.

Meine Situation ist die folgende: Ich habe einen WCF-Webservice, der mehrere Methoden nach außen bereit stellt. Diese Methoden können hierarchisch untereinander angeordnete Objekte abrufen.

Es geht beispielsweise mit einem Ordner los und danach werden die Dokumente dieses Ordners angefragt.

Aufgrund des Systems, welche diese Objekte enthält ist dieser Zugriff verhältnismäßig langsam wenn der Client meinen Webservice fragt und dieser das dahinterliegende System befragt.

Daher hatte ich mir gedacht, dass ich ein "Caching" einbaue, welches bei der Anfrage eines Ordners auch schon mal alle Dokumente holt und speichert.
Das funktioniert theoretisch mit dem WCF-Testclient auch wunderbar.

Nur wenn ich es mit der Fremdanwendung, die dann später auch meinen Webservice im Echtsystem ansprechen will, gehen die Objekte im "Cache" verloren.

Dies liegt nach meiner Einschätzung am basicHttpBinding, welches ja zustandslos ist. Ich habe nun mehrere Artikel gelesen, in denen Menschen davon berichten, dass sie durch das Servicebehaviour-Attribut "InstanceContextMode.Single" genau das erreichen konnten, was ich haben will (ironischerweise wollten diese Entwickler dieses Verhalten aber los werden ...).

Meine Klassendefinition sieht aktuell so aus:


    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
    public class DMSWebServiceSoap : IDMSWebServiceSoap

Übersehe ich irgendwas? Ist das, was ich will überhaupt mit basicHttpBinding möglich?

06.07.2011 - 23:02 Uhr

Danke schon einmal für die Antworten!

Warum zwei Server? Eine berechtigte Frage. Meine Idee dabei war das ebenfalls geforderte Load Balancing gleich mit zu erschlagen.

06.07.2011 - 21:42 Uhr

Hallo allerseits!

Ich habe eine Frage und möchte eigentlich erstmal nur wissen, ob ihr der Meinung seid, dass ich auf dem richtigen Weg bin:

Ich habe folgendes Szenario eines Lizenzservers: Es exisitert eine Lizenz für beispielsweise fünf Clients. Diese Clients können sich in verschiedenen Netzwerken befinden, die zueinander nur über jeweils einen zentralen Server Kontakt haben. In beiden Netzen muss also ein Lizenzserver installiert sein. Die beiden Server müssen sich nun "unterhalten" und dem jeweils anderen mitteilen, wieviele Sitzungen gerade offen sind, damit auf beiden Seiten maximal fünf Clients gleichzeitig aktiv sein können.

Wäre diese Kommunikation am Besten über Remoting zu machen? Ich hatte jetzt angefangen es mit Xml-Nachrichten zu bauen, die ich über Sockets verschicke. Aber natürlich wäre es schöner, wenn ich die Sitzungsobjekte direkt austauschen könnte. Ginge das, wenn ich ich diese Klassen von MarshalByRefObject ableite und diese dann per Remoting hin und her schicke? Oder habe ich da was falsch verstanden?

Grüße
Benjamin

15.05.2011 - 15:52 Uhr

Du solltest es so schreiben:

public double Hedbergite()
        {
            double IsogenAbruf = 0;
            double NocxiumAbruf = 0;
            double ZydrineAbruf = 0;

            if (!double.TryParse(lbl_IsogenAbruf.Text, out IsogenAbruf))
                 return 0;

            if (!double.TryParse(lbl_NocxiumAbruf .Text, out NocxiumAbruf ))
                 return 0;

            if (!double.TryParse(lbl_ZydrineAbruf .Text, out ZydrineAbruf ))
                 return 0;

            batch = 500;
            noc = 354;
            iso = 708;
            zyd = 32;
            erg =   (iso * Convert.ToDouble(IsogenAbruf)) + (noc * Convert.ToDouble(NocxiumAbruf)) + (zyd * Convert.ToDouble(ZydrineAbruf));
            return erg;
        }
28.08.2009 - 17:53 Uhr

Hallo allerseits!

Ich habe einen Windows-Dienst programmiert und ein Konfigurationsprogramm dafür gebaut, welches den Dienst installieren, starten und beenden können soll.

Meine Frage... ist es möglich, den Dienstnamen (der im Service-Installer-Objekt enthalten ist) aus der Assembly auszulesen, ohne das diese läuft (Metadaten oder so)?

Hat da jemand einen Einfall? Wäre sehr dankbar 😃

Grüße
Benjamin

06.01.2009 - 18:12 Uhr

Hallo allerseits!

Ich schreibe gerade an einem Windows-Dienst, der andere Programme über einen FTP-Server aktualisieren soll.

Nun kann es ja vorkommen, dass dieser Dienst selbst ein Update benötigt, welches ebenfalls auf dem Server liegt.

Gibt es eine Möglichkeit, dass sich ein Windows-Dienst selbst neu starten kann? Eine _schmutzige _Lösung wäre ja einfach ein externes Programm aufzurufen, welches dann den Neustart übernimmt. Aber geht es vielleicht auch irgendwie eleganter?

Grüße
Benjamin

21.04.2008 - 09:50 Uhr

Hallo ihr!

Ich habe ein Programm, welches ich auf einem FTP-Server veröffentlich habe.

Dazu gehört neben dem .NET-2.0 Framework auch die Laufzeitumgebung von Crystal Reports, die die IDE selbstständig eingebunden hat.

Nun lade ich (nur) die setup.exe vom FTP-Server herunter und führe sie aus. Folgerichtig informiert mich das Setup, dass .NET-Framework und Crystal Reports installiert werden soll. .NET-Frameword wird auch heruntergeladen. Crystal Reports offensichtlich auch. Allerdings klappt's dann hier wohl bei der Installation nicht:


The following properties have been set:
Property: [AdminUser] = true {boolean}
Property: [ProcessorArchitecture] = Intel {string}
Property: [VersionNT] = 5.1.2 {version}
Running checks for package '.NET Framework 2.0', phase BuildList
Running external check with command line "C:\DOKUME~1\Benjamin\LOKALE~1\Temp\VSD103.tmp\dotnetfx\dotnetchk.exe" -lcid:1031
Process exited with code 2
Setting value '2 {int}' for property 'DotNetInstalled'
Reading value 'Version' of registry key 'HKLM\Software\Microsoft\Internet Explorer'
Read string value '6.0.2900.2180'
Setting value '6.0.2900.2180 {string}' for property 'IEVersion'
The following properties have been set for package '.NET Framework 2.0':
Property: [DotNetInstalled] = 2 {int}
Property: [IEVersion] = 6.0.2900.2180 {string}
Running checks for command 'dotnetfx\instmsia.exe'
Result of running operator 'ValueExists' on property 'VersionNT': true
Result of checks for command 'dotnetfx\instmsia.exe' is 'Bypass'
Running checks for command 'dotnetfx\WindowsInstaller-KB893803-v2-x86.exe'
Result of running operator 'ValueExists' on property 'Version9x': false
Result of running operator 'VersionLessThan' on property 'VersionNT' and value '5.0.3': false
Result of running operator 'VersionGreaterThanOrEqualTo' on property 'VersionMsi' and value '3.0': true
Result of checks for command 'dotnetfx\WindowsInstaller-KB893803-v2-x86.exe' is 'Bypass'
Running checks for command 'dotnetfx\dotnetfx.exe'
Result of running operator 'ValueNotEqualTo' on property 'DotNetInstalled' and value '0': true
Result of checks for command 'dotnetfx\dotnetfx.exe' is 'Bypass'
Running checks for command 'dotnetfx\langpack.exe'
Result of running operator 'ValueEqualTo' on property 'DotNetInstalled' and value '2': true
Result of checks for command 'dotnetfx\langpack.exe' is 'Bypass'
'.NET Framework 2.0' RunCheck result: No Install Needed
Running checks for package 'Berichts-Viewer von Microsoft Visual Studio 2005', phase BuildList
Running external check with command line "C:\DOKUME~1\Benjamin\LOKALE~1\Temp\VSD103.tmp\ReportViewer\ReportViewerChk.exe" -lcid:1031
Process exited with code 1
Setting value '1 {int}' for property 'ReportViewerInstalled'
The following properties have been set for package 'Berichts-Viewer von Microsoft Visual Studio 2005':
Property: [ReportViewerInstalled] = 1 {int}
Running checks for command 'ReportViewer\ReportViewer.exe'
Result of running operator 'ValueNotEqualTo' on property 'ReportViewerInstalled' and value '0': true
Result of checks for command 'ReportViewer\ReportViewer.exe' is 'Bypass'
Running checks for command 'ReportViewer\ReportViewerLP.exe'
Result of running operator 'ValueEqualTo' on property 'ReportViewerInstalled' and value '2': false
Result of running operator 'ValueEqualTo' on property 'AdminUser' and value 'false': false
Result of checks for command 'ReportViewer\ReportViewerLP.exe' is 'Install'
'Berichts-Viewer von Microsoft Visual Studio 2005' RunCheck result: Install Needed
EULA for components 'Berichts-Viewer von Microsoft Visual Studio 2005' was accepted.
Copying files to temporary directory "C:\DOKUME~1\Benjamin\LOKALE~1\Temp\VSD103.tmp\"
Downloading files to "C:\DOKUME~1\Benjamin\LOKALE~1\Temp\VSD103.tmp\"
(18.04.2008 17:30:15) Downloading 'ReportViewer\ReportViewerLP.exe' from 'http://go.microsoft.com/fwlink/?LinkId=49981/ReportViewer/ReportViewerLP.exe' to 'C:\DOKUME~1\Benjamin\LOKALE~1\Temp\VSD103.tmp\'
Download completed at 18.04.2008 17:30:16
Verifying file integrity of C:\DOKUME~1\Benjamin\LOKALE~1\Temp\VSD103.tmp\ReportViewer\ReportViewerLP.exe
WinVerifyTrust returned -2146762749
Subject form unknown
Running checks for package 'Berichts-Viewer von Microsoft Visual Studio 2005', phase BeforePackage
Running external check with command line "C:\DOKUME~1\Benjamin\LOKALE~1\Temp\VSD103.tmp\ReportViewer\ReportViewerChk.exe" -lcid:1031
Process exited with code 1
Setting value '1 {int}' for property 'ReportViewerInstalled'
The following properties have been set for package 'Berichts-Viewer von Microsoft Visual Studio 2005':
Property: [ReportViewerInstalled] = 1 {int}
Running checks for command 'ReportViewer\ReportViewerLP.exe'
Result of running operator 'ValueEqualTo' on property 'ReportViewerInstalled' and value '2': false
Result of running operator 'ValueEqualTo' on property 'AdminUser' and value 'false': false
Result of checks for command 'ReportViewer\ReportViewerLP.exe' is 'Install'
'Berichts-Viewer von Microsoft Visual Studio 2005' RunCheck result: Install Needed
Verifying file integrity of C:\DOKUME~1\Benjamin\LOKALE~1\Temp\VSD103.tmp\ReportViewer\ReportViewerLP.exe
WinVerifyTrust returned -2146762749
Subject form unknown
Error: Die Datei "C:\DOKUME~1\Benjamin\LOKALE~1\Temp\VSD103.tmp\ReportViewer\ReportViewerLP.exe" wurde seit ihrer ersten Veröffentlichung geändert.

Hat jemand schon mal etwas ähnliches bei dieser oder vielleicht bei einer anderen Komponente gesehen und weiß, was das genau bedeutet und wie man es abstellen kann?

Gruß
Benjamin

21.04.2008 - 09:47 Uhr

Danke für eure Antworten 🙂

Mittlerweile habe ich auch eine ganz brauchbare Lösung gebastelt: Mit SharpPDF.

15.04.2008 - 16:39 Uhr

Hallo Leute,

nachdem ich nun ein bisschen mit der Bastellösung von BerndFfm herumgespielt habe... das mit Ghostscript funktioniert ja ganz gut.

Leider scheint es mir nicht möglich zu sein, als Windows Dienst ein Word-Dokument in Postscript umzuwandeln.

Oder hat hier noch jemand eine gute Idee?

Gruß
Benjamin

14.04.2008 - 20:25 Uhr

Danke 🙂

Gibt's das auch für frühere Versionen wie Word 2003?

Gruß
Benjamin

14.04.2008 - 17:45 Uhr

Hallo ihr da draußen,

ich suche eine Möglichkeit, aus einem Worddokument ein PDF-Dokument zu erstellen. Das Ganze soll so ähnlich funktionieren, wie bei diesen virtuellen Drucktreibern, die ein PDF aus jeder Datei erstellen können. Nur soll das ganze ohne weitere Rückfragen funktionieren. Sprich ich möchte keinen Pfad angeben müssen bzw. diesen Pfad einmal für immer vorgeben (das Programm, welches diese Funktionalität benutzen soll, ist ein Windows-Dienst).

Hat da jemand eine Idee?

Gruß
Benjamin

11.04.2008 - 10:27 Uhr

Die Methode, die in einem extra Thread ausgeführt wird, hat als Abschluss im Finally-Ast folgenden Code


socket.Close()

Ist das ausreichend oder braucht man noch mehr?

10.04.2008 - 09:43 Uhr

Hallo allerseits!

Ich habe einen Windows-Dienst, der auf einem bestimmten Port auf Nachrichten wartet. Hier ist der entsprechende Code:


public void StartWaitForConnections()
        {
            try
            {
                TcpListener myList = new TcpListener(_intPort);

                myList.Start();

                while (_bRunListener)
                {
                    Socket s = myList.AcceptSocket();
                    s.LingerState = new LingerOption(false, 0);
                    OnDataArrival(s);
                }
                myList.Stop();
            }
            catch (ThreadAbortException)
            {
                return;
            }
            catch (Exception)
            {

                throw;
            }
        }

Es passiert im Prinzip folgendes: Wenn auf dem Port eine Nachricht eingeht, wird ein neues Socket-Objekt erstellt und dieses mit einem Event (OnDataArrival) an eine ausstehende Klasse weitergegeben, die dann für die weitere Verarbeitung einen neuen Thread startet.

Dies funktioniert auch alles ganz fein.

Allerdings passiert rund alle sieben, acht Tage folgendes: Es können keine Nachrichten mehr angenommen werden (z.B. läuft Telnet in einen Timeout). Wenn ich dann den Dienst beende und neu starte wirft die Applikation manchmal eine Socket-Ausnahme:


System.Net.Sockets.SocketException: Normalerweise darf jede Socketadresse (Protokoll, Netzwerkadresse oder Anschluss) nur jeweils einmal verwendet werden
   at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)

Dies bedeutet für mich, dass das Programm offenbar noch auf dem Port lauscht, auf dem es offenbar keine Nachrichten mehr entgegen nehmen kann.

Hat jemand schonmal etwas ähnliches erlebt?

Gruß
Benjamin

17.01.2008 - 11:41 Uhr

Hallo Leute,

ich habe da mal eine ganz blöde Frage (denke ich mal).

Derzeit programmiere ich eine Anwendung, die Nachrichten aus dem Internet empfangen soll. Wenn das Programm auch direkt am Internet hängt, funktioniert auch alles gut (TCP-Listener kriegt dann die Internet-IP zugewiesen).

Wenn das Programm nun aber in einem LAN läuft und am Router Portforwarding eingestellt ist (für den betreffenden Port). Gibt man TCP-Listener dann die lokale (also LAN-IP) oder die WAN-IP mit?

Ich hab schon beide Varianten ausprobiert; bekomme aber immer die Exception, dass der Zielcomputer die Verbindung verweigerte.

Irgendwelche Ideen, vielleicht? 🙂

Gruß
Benjamin

13.12.2007 - 21:17 Uhr

Wie regen schon sagt... es gehört sich nicht, in einer Konfigurationsdatei herum zu schreiben, welche im Programmverzeichnis liegt.

Die Einstellungen, die in der app.config stehen, sollen einmal am Anfang vom Admin oder sonst wem, dem man zutrauen kann, einen Texteditor zu bedienen zu können, gesetzt werden. Danach wird die Datei nicht wieder angefasst.

Alles, was man verändern will muss in den Bereich der Benutzereinstellungen.

Gruß

12.12.2007 - 20:35 Uhr

Ich kenne gleiche Probleme mit VS 2005 - leider. Manchmal sogar sehr hartnäckig, sodass Öffnen und Schließen des Designers nicht (beim ersten Mal) hilft.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ujr am 12.12.2007 10:51.

Endlich mal jemand, der das gleiche Problem hat, wie ich...

Ich finde es erstaunlich, dass dieser offensichtliche Fehler, der schon in VS 2003 drin war auch nach dem SP1 von der 2005er Version immer noch drin ist...
Hat denen das noch keiner gesagt? Ist das noch keinem dort aufgefallen?

Gruß

12.12.2007 - 09:28 Uhr

richtig darum fragte ich ja,

kannst du es auf spezielle änderungen begrenzen oder tritt das gane sporadisch auf

mfg

Anscheinend hat es etwas mit selbsterstellten Controls zu tun. Bisher ist dieses Phänomen nämlich nur bei Projekten in der Firma aufgetreten, die selbsterstellte Controls enthielten. Bei anderen Projekten, die ohne diese Controls auskommen, scheint dieses Problem nicht aufzutreten.

Gruß

11.12.2007 - 22:04 Uhr

Nein... es handelt sich um den vor IDE erstellten Code.

11.12.2007 - 22:02 Uhr

*am Kopf kratz*

Hey... coole Idee 😁 Manchmal gehts auch einfacher 😉

11.12.2007 - 20:38 Uhr

Hallo Community,

ich habe schon seit Visual Studio 2003 mit einem Problem zu kämpfen, was einfach nervt und ich weiß nicht, ob einfach nur was falsch konfiguriert ist oder ob Visual Studio einfach nur einen (weiteren) Bug hat...

Beim Arbeiten mit dem Windows Form Designer kommt es immer mal wieder vor, dass nach einem Wechsel von Quelltext- zu Form-Editor alle (oder fast alle) Controls auf einer Form verschwinden.

Nur schließen und Neuöffnen des Designers schafft hier Abhilfe.

Kennt das jemand oder hat vielleicht sogar eine Lösung parat? 🙂

Gruß
Benjamin

11.12.2007 - 20:32 Uhr

Eigentlich, korrigiert mich, wenn ich falsch liege, sollte es doch dieser Code hier bringen


string name = textbox1.Text;

foreach(Control ctl in this.Controls)
{
if (ctl.Name == name)
{
ctl.Visible = false;
}
}

Erzeugt vielleicht ein wenig Overhead, weil halt alle Controls angeschaut werden. Aber ich denke, solche Kleinigkeiten lassen sich vernachläßigen, wenn man nicht tausende Controls hat.

Oder als Alternative, wenn man wirklich viele Controls hat, ein Dictonary-Objekt... z.b. wie folgt:

Das kommt z.b. ins Load-Ereignis einer Form.


// Ist ein Feld der Form
Dictonary <string, Control> MeineControls = new Dictonary<int, Control>();

foreach(Control ctl in this.Controls)
{
MeineControls.Add(ctl.Name, ctl);
}

Wenn nun ein Panel unsichtbar werden soll....


string name = text1.Text;

MeineControls[name].Vsibile = false;

Durch den generischen Typen hast du direkten Zugriff auf das Control. Irgendwelche Casts werden nicht ausgeführt und das Dictonary ist dank der Hash-Funktion auch schnell... die Keys müssen halt eindeutig sein, was bei Controlnamen aber der Fall sein sollte.

Die zweite Lösung verlangsamt nur halt das Laden der Form.

Gruß
Benjamin