Wer dafür keine Zeit/Budget hat, ist mit (zB) dem von mir genannten Framework oder auch log4net sicher besser bedient.
Ggf. kommt - neben der Funktionalität - ein weiterer Aspekt zum Tragen: Die unterstützten Plattformen. log4net ist eines der wenigen Frameworks, die überhaupt und mit vollem Umfang auf CF und Mono laufen.
Ansonsten: Data Protection API (DAPI).
Jedoch sehe ich immer häufiger den Ansatz, dass für die Kommunikation mit WCF spezielle Transportobjekte erstellt werden.
Der Grund dafür liegt in der Entkopplung der Schichten. Stichwort: Robustheit gegenüber Änderungen. Grundsätzlich sinnvoll.
BTW, Filezilla-Server beherrscht ebenfalls FTPS.
- wenn ich den korrekten Port habe: kann ich auch eine SSL verschlüsselung machen OHNE "https" vor die adresse zu setzen, also via http?
Gar nicht. Wenn du https machen willst, musst du auch https angeben.
- wie kann ich die mir gegebenen Zertifikate einbinden?
Um welche Zeritifkate handelt es sich denn? Mit deiner TrustAllCertificatePolicy erreichst du, dass du dich um das Server-Zertifikat nicht kümmern brauchst. Wenn dein Client sich mit einem Zertifikat authentifizieren muss (das ist optional), dann machst du das mit:
serviceObject.ClientCertificates.Add(myX509ClientCert);
- welche sonstigen änderungen muss ich vornehmen damit mein Client SSL nutzt?!
Keine.
immer wenn ich https einstelle kommt der fehler: "ServicePointManager unterstützt keine Proxys mit dem https-Schema".
Bei https gibts keine Proxies. Stattdessen wird direkt eine Socket-Verbindung über den https-Port vom Client zum Server hergestellt. Eure Firewall muss den Port natürlich durchlassen. Also bei https raus mit de Proxy-Definition.
http://www.checkupdown.com/status/E403.html
Entweder weist dich der Webserver selbst oder ein Proxy ab. In solchen Fällen empfiehlt es sich, den HTTP-Verkehr mit einem HTTP-Sniffer zu belauschen um zu schauen, was genau da auf der Leitung abgeht.
Zumindest bei WCF kann man erreichen, dass alle Typen direkt im WSDL-Dokument eingebettet sind. Leider ist das nicht so out-of-the-Box zu haben, sondern man muss ein paar Zeilen Code schreiben (Implementierung von IWsdlExportExtension) und die .config entsprechend anpassen (Behaviors hinzufügen). In den u.g. Beispielen wird das direkt im Code gemacht (custom host). Ich persönlich mag es lieber über die Konfig...
http://winterdom.com/2006/10/inlinexsdinwsdlwithwcf
http://blogs.thinktecture.com/cweyer/archive/2007/05/10/414840.aspx
Aber das kommt IMHO dennoch zu kurz - letztendlich bleibt eine Klasse eine Klasse - egal wie viele Regions und Partials mann auch einbaut.
Vielleicht habe ich nicht klar genug ausgedrückt, was ich intendiert haben. Weder partial classes noch Regions ändern etwas an der _Struktur _ oder inneren Komplexität einer Klasse. Es geht um die _Ansicht _darauf, also um "Ordnung", um ein Navigationsprinzip, menschliche Wahrnehmung. Gefühlte Komplexität = tatsächliche Komplexität (gemäß Metrik X) + äußere Ordnung.
Ich persönlich gebrauche weder partial classes noch Regions, weil meine Entwicklungswerkzeuge m.E. genug Navigationsmöglichkeiten bereitstellen. Das ist aber meine persönliche Vorliebe. In anderen Umgebungen oder vielleicht im Kontext von Konfigurationswerkzeugen, Reviews, etc. mag das anders aussehen.
Partial Classes sind IMHO genau für eines nützlich, für automatisch generierten Code der noch selber erweitert werden soll, Punkt.
Falsch. Punkt. Es ist ein Fakt, dass man sie benutzen _kann _um Code nach bestimmten Gesichtspunkten zu unterteilen (damit sind sie nützlich). Was noch nicht die Frage beantwortet ob es auch angemessen ist das so zu tun (ein Hammer ist auch _nützlich _um jemanden den Kopf einzuschlagen), oder ob es bessere Prinzipen gibt. Die Beantwortung dieser Fragen ist aber gewiss differenzierter als "Punkt".
Ob es Sinn macht die Funktionalität der Klasse noch strukturell zu verfeinern kann man von außen natürlich schlecht beurteilen. Angenommen es handelt sich nur um ein Übersichtlichkeitsproblem, dann hat man m.E. zwei Möglichkeiten etwas zu verbessern:
Wenn man aber weder interoperabel sein , noch über das Internet kommunizieren muss, bringt WCF keinen nennenswerten Vorteil.
Diese Aussage ist m.E. nur bedingt richtig. Remoting ist durch seine enge Kopplung eher nicht geeignet um SOA zu machen. Will man SOA im Unternehmen etablieren, wäre WCF wieder erste Wahl, auch wenn es im LAN stattfindet.
Ich benutze diese Typen eigentlich nur im Kontext von Streams (byte) bzw. bei PInvokes.
Wir haben uns hier auch einen kleinen Remote-Desktop fürs CE gebastelt. Die Erfahrungen daraus: Remote mit CE zu arbeiten ist ok für die Entwicklung (z.B. bei Problemen bei headless devices), aber produktiv arbeiten ist völlig Banane. Einem Kunden kann man Remote-Lösungen auf Framebuffer-Basis m.E. nicht anbieten.
Server: http://sourceforge.net/projects/wincevncsvr/
Client: http://www.br-automation.com/cps/rde/xchg/br-productcatalogue/hs.xsl/cookies_allowed.htm?caller=services_138133_DEU_HTML.htm
Clients gibts verschiedene, z.B. wohl auch von RealVNC.
Riecht nach einem Threading-Problem. Vermutlich die Messagebox im Exception-Handler.
Nach meiner Erfahrung gibt's mit DataReceived oft Ärger.
Das kann ich zwar nicht bestätigen, aber definitiv ist das Lesen der Daten im UI-Thread die Ursache des Problems. Schön im Eventhandler lesen und die Daten via BeginInvoke in den UI-Thread übergeben.
Wäre es nicht deutlich sinnvoller, statt eines Fehlers nur eine Warnung auszugeben
Ganz eindeutig nein. Man könnte sich vielleicht eine bessere statische Analyse wünschen, die aber ordentlich Compile-Time produziert. Warnung über Nicht-Initialisierungen werfen Compiler seit Generationen, trotzdem ist es einer der häufigsten Fehlerquellen geblieben. Hier mehr Disziplin seitens des Compilers zu fordern, ist ein Weg zu mehr Qualität, welche sicher höher zu bewerten ist als die Faulheit der Entwickler.
Da muss man wohl nach Indien fahren und die MS-Entwickler befragen (aber die wissen es wohl selbst nicht...). Selbst Chris Tacke hat sich daran die Zähne ausgebissen:
http://blog.opennetcf.com/ctacke/PermaLink,guid,4581cf35-39b2-4ed1-8fdf-340b02095ab1.aspx
[...] At this point I have to chalk it up to a huge WTF in the Microsoft code.[...] At this point I have no option but to go the route that the UNIMODEM dialer went (again in PB source) and set it in the registry at HKEY_LOCAL_MACHINE\Drivers\Unimodem\Init.
Vermutlich handelt es sich um ein Code-Artefakt.
VB.NET (und auch COM) kann das. C# kennt eben nur einen Indexer. Selbst Überladung hilft da nicht, denn ich kann ja verschiedene Properties haben wollen, deren Signatur gleich ist. Bei COM-Wrappern merkt man diesen Mangel manchmal, wenn man Getter/Setter-Funktionen findet. Einer fehlt dann meist: Der ist als Indexer umgesetzt.
public bool _b1; // 1 bit
Bool ist NICHT ein Bit, sondern per Default 4 Bytes (!). Mittels MarshalAsAttribute kannst du das aber auch zu einem _Byte _marshallen. Aber Achtung: Hier schlägt dann wieder das Alignment zu. Du brauchst also noch für DllImport den Pack=1 Parameter (Default ist 8).
Das ist Modem-weit. Was anderes macht ja auch keinen Sinn, denn es handelt sich ja letztlich um die Konfiguration des Modem im Zusammenhang mit der SIM-Karte.
Die Objekterzeugung ist ja nicht das teure. Richtig teuer ist das Parsen, wenn der Regex nicht compiliert wird. Bei wiederkehrenden Ausdrücken mag es daher Sinn machen, die Regex-Objekte in einem Dictionary zu cachen.
Ist mir nicht bekannt. Liegt vermutlich auch daran, dass es keine zur "Scrum Alliance" vergleichbare Organisation gibt, die die Anforderungen an ein solches Zertifikat erfüllt. Ich bin ohnehin recht skeptisch, was solche Zertifikate angeht, zumindest wenn sie schon nach zwei Tagen Schulung vergeben werden...
Ich behaupte: 90% aller Entwickler machen im Prinzip nur C# 2.0. Deswegen ist es völlig Wurscht wie C# 5.0 aussieht: Es benutzt eh kaum jemand.
Manchmal ist weniger auch mehr...
Das sagt dir, dass vor Beginn des Wählen zwei Init-Strings (AT-Kommandos) an das Modem geschickt werden.
Und da muss jetzt noch ein Eintrag AT+CGDCONT=1,"IP","tele2.at" unter dem Namen 3 dazu.
Hast du denn mal in der Registry geschaut, ob unter dem von mir genannten Schlüssel einträge existieren?
Bei mir ist der Pfad:
HKEY_LOCAL_MACHINE\Drivers\Unimodem\Settings\Init
Aufpassen: Jeder String muss "OK" zurückliefern, sonst liefert RasDial() eine Fehlermeldung.
Noch ein kleiner Tipp:
Man sollte zwischen gestartetem Dial und Hangup immer mindestens 3 Sekunden Pause verstreichen lassen. Man kann RAS sonst komplett in den Bach schicken. In der Win32-Hilfe findet sich ein entsprechender Hinweis (der in der CE-Hilfe leider fehlt).
Schwierig, weil es die Rolle des "Masters" dort ja gar nicht so explizit gibt. XP beschreibt ja primär wie das Team agiert
Das geht direkt über die Registry:
http://msdn.microsoft.com/en-us/library/ms881621.aspx
Wird allerdings vor jedem Wählen ausgeführt.
Wichtig ist: Hole Punching ist keine sichere Sache. Je nach NAT kann das klappen oder nicht.
Sicher ist nur eins: Der Server macht den Vermittler (Relay) und die Clients pollen. Die .NET-Technolgie heisst ".NET Service Bus", Teil der Azure-Plattform.
Wie dem auch sei. Im CF darfst du das alles per Hand machen.... also HttpWebRequest, Content rein.
Hört sich irgendwie nach REST an. Hast du mal ein Beispiel eines Requests?
Alles klar. Ich ziehe jetzt einfach alle Captures aus allen Groups und bügle das damit flach.
@ Herbi
Erstmal danke für die liebe Mühe. Funzt soweit super. Noch eine Frage: Bei meinem ersten Beispiel erzeugt der Ausruck 2 Captures, letzterer ist leer. Ist nicht dramatisch (kann man entfernen), aber wie entsteht das Ding?
Ich vermute auch mal, dass eine Regex hier kaum möglich ist. Ein einfaches Split tut es leider auch nicht, denn Klammern und Kommas sind ja gültige Zeichen innerhalb von Anführungsstrichen.
Ich brauchen einen Regex, der mir Modem-Responses parst. Die Response besteht aus dem Command (hier +COPS), gefolgt von Doppelpunkt und Leerzeichen. Danach folgende 1-n Gruppen von Werten, die durch Komma getrennt sind:
Einfachster Fall
+COPS: 2
Geliefert werden sollte: Eine Gruppe mit dem Inhalt 2
Mehrere Werte:
+COPS: 2,4
Geliefert werden sollte: Zwei Gruppen mit dem Inhalt 2 und 4
Anführungsstriche sollten beachtet werden:
+COPS: 2,"Voda, fone",5
Und es gibt auch Gruppen:
+COPS: (2,"o2 - de","o2 - de","26207",0),(2,"o2 - de","o2 - de","26207",2),(0,"T-Mobile D","TMO D","26201",2),(0,"T-Mobile D","TMO D","26201",0),(0,"E-Plus","E-Plus","26203",0),(3,"Vodafone.de","voda DE","26202",0),(3,"Vodafone.de","voda DE","26202",2),(0,"E-Plus","E-Plus","26203",2)
Hier wäre der Inhalt der ersten Gruppe:
(2,"o2 - de","o2 - de","26207",0)
Jemand eine Idee?
das Poblem ist aber, das sich der Zuweisungsoperator bei string wie bei Wertetypen verhält - er erzeugt eine echte Kopie:
string ist zwar ein Referenztyp, ist aber als "immutable type" implementiert, d.h. er ist unveränderlich: Ein String kann niemals verändert werden. Damit "ähnelt" das Verhalten dem eines Wertetypes.
http://www.yoda.arachsys.com/csharp/strings.html
Wie muss man einen Referenztyp definieren, das er sich verhält wie string? d.h. das eine "new" List() nicht nur eine neue Liste erstellt sonder auch alle Elemente kopiert - so wie bei einer List<string>.
Dieser Fall wäre eben nicht mit string identisch, da dort niemals Kopien erstellt werden.
http://weblogs.asp.net/bleroy/archive/2008/01/16/immutability-in-c.aspx
Das kann nur der Client entscheiden.
Für das Bauen einer CE-basierten Plattform stehen 2 verschiedene Compact Frameworks zur Verfügung. Neben der "normalen", die z.B. bei Smartphones zum Einsatz kommt, gibt es noch eine "headless"-Version, der alle fensterbasierten Geschichten fehlt. Das ist insofern kritisch, weil weil einige Komponenten von Drittherstellern WinForms zwingend vorsehen (Fensterhandle im Konstruktor).
Welche CF-Version du auf dem Gerät vorfindest, ist nicht direkt von der BS-Version abhängig. Es gibt CF 3.5 für Windows CE 5.x aber auch CF 2.0 für CE 6-Geräte. Es kann auch sein, dass CF überhaupt nicht vorinstalliert ist. Also beim Hersteller nachfragen. Ggf. musst du selbst nachinstallieren. Meistens wirst du CF 2.0 vorfinden.
Welche Leistungsmerkmale ein CE 5/6-Device aufweist muss man prüfen. CE ist ein durch den Hersteller modular erstellbares System. D.h. in der Praxis, dass bestimmte Funktionen komplett fehlen können. Wenn man es genau wissen will, sollte man sich die Liste der Module des Platform Builders geben lassen.
Nur wenn ein System den Namen "Windows Mobile" trägt, sind von MS die Mindestvorraussetzungen für dieses CE-System definiert. Bei WM kannst du davon ausgehen, dass jede Funktionen des CF durch das BS unterstützt wird. CF-Anwendungen einer speziellen CE-Plattform wird immer auch auf einem WM-System laufen. Umgekehrt nicht zwingend. Das macht sich dann in Form einer Exception zur Laufzeit bemerkbar.
So ist es noch schöner und spart dir den Umweg via IntPtr:
[DllImport("modul.dll")]
public static extern int SetValue(int id, ref uint value);
Per Default kopiert VS referenziert Assemblies in der Ausführungsverzeichnis, soweit sie nicht im GAC sind bzw. es anderweitig konfiguriert ist. Ggf. machen aber noch nicht registrierte COM-Komponenten Probleme.
Besorge dir "fuslogvw.exe" von MS und benutze es um den Start der Anwendung auf dem problematischen System zu analysieren.
Der Download bei Codeproject funzt wohl nicht mehr. Guckst du hier:
BTW: Wenn du für jede CAN-Botschaft einen Callback auslöst, dann wirst du auch Ressourcen-Probleme bekommen. Erst recht wenn du mehrere CANs parallel mitlauschst. Du solltest per C++/CLI eine Mittelschicht bauen, die puffert - vergleichbar zum Serialport - und ggf. mehrere Botschaften am STück in den managed Code schiesst.
Welche Timer-Klasse verwendest du?
Eine Schleife die den Serial-Port beackert muss in einen eigenen Thread ausgelagert werden, da sonst dein UI blockiert. Deswegen wird vermutlich auch dein (Winforms-) Timer nicht funzen, weil die Meldung des Timers wegen des blockierten UIs (bzw. dessen Message-Pumpe) nicht ankommen.
Serial-Port-Programmierung macht fast immer den Einsatz von Threads notwendig.
Nein, WCF benötigt .NET 3.0 aufwärts unn deswegen mindestens Windows XP SP2 bzw. Windows Server 2003.
Hört sich wieder mal nach dem Encoding Problem an (RPC vs. Document). Nimm mal WCF um den Client zu basteln.
*edit* Zu spät.... WCF sollte vielleicht trotzdem helfen. Das unterstützt deutlich mehr Encoding-Typen.
Klar beherrscht WCF bei SOAP-Webservices Sessions. Dein Problem liegt aber hier:
Der Client wäre nicht aus der .NET - Welt (bzw. Microsoft).
Nun gibt es leider nur ein halbwegs "kompatibles", automatisches Session-Modell: Browser-Cookies. Und das macht WCF nur bei Einschalten des o.g. ASP.NET compatibility mode.
Ansonsten steht dir immer frei die Sessions per Hand zu implementieren, also als ID durch alle Service-Methode zu schleifen. Dieses Modell hat durchaus große Vorteile.
Ein Rechner nicht _eine _GUID. GUID sind "zufällig" generierte, eindeutige Werte. Davon kannst du dir auch mehrere generieren lassen. Da die MAC-Adressen von Netzwerkadaptern auch eindeutig sind (bzw. sein sollten) hat man u.a. daraus GUIDs abgeleitet. Das ist aber nur _ein _Verfahren. Was ist z.B. mit Rechnern ohne Netzwerkadapter?
Es gibt eine Klasse GUID in .NET, die generiert die entsprechende Werte. Wie die genau zustande kommen ist im Prinzip völlig Wurscht.