Laden...
S
svenson myCSharp.de - Member
Dipl. Inf. Berlin Dabei seit 15.04.2005 8.746 Beiträge
Benutzerbeschreibung

Forenbeiträge von svenson Ingesamt 8.746 Beiträge

17.09.2009 - 11:09 Uhr

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.

16.09.2009 - 23:23 Uhr

Ansonsten: Data Protection API (DAPI).

11.09.2009 - 11:37 Uhr

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.

09.09.2009 - 20:54 Uhr

BTW, Filezilla-Server beherrscht ebenfalls FTPS.

08.09.2009 - 11:17 Uhr
  • 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.

08.09.2009 - 10:45 Uhr

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.

07.09.2009 - 12:43 Uhr

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

04.09.2009 - 18:16 Uhr

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".

04.09.2009 - 16:27 Uhr

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:

  1. Regions
  2. Partial Classes (z.B. ein extra File für die öffentlichen Methoden)
04.09.2009 - 15:59 Uhr

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.

03.09.2009 - 23:29 Uhr

Ich benutze diese Typen eigentlich nur im Kontext von Streams (byte) bzw. bei PInvokes.

03.09.2009 - 12:38 Uhr

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.

03.09.2009 - 10:45 Uhr
  1. Nein.
  2. Nein.
03.09.2009 - 10:43 Uhr

Riecht nach einem Threading-Problem. Vermutlich die Messagebox im Exception-Handler.

03.09.2009 - 10:39 Uhr

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.

03.09.2009 - 10:35 Uhr

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.

01.09.2009 - 17:52 Uhr

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.

01.09.2009 - 11:39 Uhr

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.

01.09.2009 - 11:31 Uhr
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).

01.09.2009 - 11:17 Uhr

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.

31.08.2009 - 23:28 Uhr

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.

31.08.2009 - 23:25 Uhr

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...

31.08.2009 - 18:04 Uhr

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...

31.08.2009 - 17:56 Uhr

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.

31.08.2009 - 15:05 Uhr

Hast du denn mal in der Registry geschaut, ob unter dem von mir genannten Schlüssel einträge existieren?

31.08.2009 - 12:27 Uhr

Bei mir ist der Pfad:

HKEY_LOCAL_MACHINE\Drivers\Unimodem\Settings\Init

Aufpassen: Jeder String muss "OK" zurückliefern, sonst liefert RasDial() eine Fehlermeldung.

31.08.2009 - 11:45 Uhr

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).

31.08.2009 - 11:31 Uhr

Schwierig, weil es die Rolle des "Masters" dort ja gar nicht so explizit gibt. XP beschreibt ja primär wie das Team agiert

31.08.2009 - 11:20 Uhr

Das geht direkt über die Registry:

http://msdn.microsoft.com/en-us/library/ms881621.aspx

Wird allerdings vor jedem Wählen ausgeführt.

31.08.2009 - 10:55 Uhr

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.

26.08.2009 - 15:45 Uhr

Wie dem auch sei. Im CF darfst du das alles per Hand machen.... also HttpWebRequest, Content rein.

26.08.2009 - 12:24 Uhr

Hört sich irgendwie nach REST an. Hast du mal ein Beispiel eines Requests?

26.08.2009 - 12:23 Uhr

Alles klar. Ich ziehe jetzt einfach alle Captures aus allen Groups und bügle das damit flach.

26.08.2009 - 11:12 Uhr

@ 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?

25.08.2009 - 17:23 Uhr

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.

25.08.2009 - 17:11 Uhr

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?

24.08.2009 - 12:07 Uhr

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

24.08.2009 - 11:37 Uhr

Das kann nur der Client entscheiden.

24.08.2009 - 10:54 Uhr

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.

20.08.2009 - 16:20 Uhr

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);
19.08.2009 - 16:43 Uhr

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.

19.08.2009 - 11:16 Uhr

Der Download bei Codeproject funzt wohl nicht mehr. Guckst du hier:

http://www.papadi.gr/devblog.aspx?EntryID=42

18.08.2009 - 16:25 Uhr

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.

18.08.2009 - 16:21 Uhr

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.

18.08.2009 - 10:04 Uhr

Nein, WCF benötigt .NET 3.0 aufwärts unn deswegen mindestens Windows XP SP2 bzw. Windows Server 2003.

17.08.2009 - 17:01 Uhr

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.

14.08.2009 - 14:11 Uhr

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.

14.08.2009 - 10:25 Uhr

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.