Laden...
Avatar #avatar-2010.jpg
wdb.lizardking myCSharp.de - Member
Informatikstudent Niederbayern Dabei seit 28.08.2006 100 Beiträge
Benutzerbeschreibung

Forenbeiträge von wdb.lizardking Ingesamt 100 Beiträge

09.10.2007 - 16:24 Uhr

Ausgehend von folgendem Beispiel Implementing Protected Configuration With Windows Apps
habe ich einen String, der verschlüsselt in der App.config abgelegt ist.

Mein Code zur Verschlüsselung mittels ProtectSection sieht so aus:


Configuration config =  ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSection section = config.GetSection("applicationSettings/Anwendung.Properties.Settings");

if (!section.SectionInformation.IsProtected)
                section.SectionInformation.ProtectSection("DPAPIProtection");

section.SectionInformation.ForceSave = true;
config.Save(ConfigurationSaveMode.Full);

Danach kann ich wie gewohnt per


String test = Anwendung.Properties.Settings.Default.Geheimcode

auf den unverschlüsselten Wert zugreifen, da durch den ProtectionProvider, in meinem Fall System.Configuration.DpapiProtectedConfigurationProvider, die Entschlüsselung automatisch vonstatten geht.

Nun wollte ich den gelesen Wert anstatt in einen normalen String in einen SecureString schreiben, damit der gelesene Wert nicht im Klartext im Speicher steht.

Nun sehe ich aber im Debugger, dass der Wert für Anwendung.Properties.Settings.Default.Geheimcode im Klartext angezeigt wird, wenn ich mit der Maus darüberfahre.
Also gehe ich davon aus, dass der unverschlüsselte String nach dem Lesen direkt so im Speicher steht und eine Ablage in einem _SecureString _ darum nichts bringen würde.

Darum die Frage ob ich die Properties-Eigenschaft quasi zurücksetzen kann, ohne dass meine App.config darunter leiden muß oder ob der Ansatz grundsätzlich nicht gut ist.

Das es keine clientseitige Sicherheit gibt, ist mir bekannt, nur möchte ich es einem potentiellen Angreifer nicht unnötig leicht machen den geheimen Wert zu erfahren indem er einfach ein Speicherabbild des Programmes durchforstet.

08.10.2007 - 15:15 Uhr

Wunderbar, ich mag einfache Lösungen 🙂

Danke für deine Mühen.

08.10.2007 - 14:59 Uhr

Hallo,
ich habe eine 16-bit-Executable (zumindest besagt dies die Fehlermeldung), welche ich per Process.Start ausführen möchte.

Allerdings kommt immer eine Zugriffsverletzung beim Aufruf der Start()-Methode:


  Process encProcess = new Process();
  encProcess.StartInfo.FileName = @"C:\Temp\ENCRYPT.EXE";
  encProcess.StartInfo.UseShellExecute = true; // = false
  encProcess.Start();

Wenn ich die Exe direkt im Windows-Explorer oder per Kommandozeile starte, funktioniert es unter Windows.
Lege ich dagegen eine MSDOS-Kompatibilitätsdatei (.PIF) mit Standardeinstellungen an, kommt unter Windows dieselbe Fehlermeldung wie beim Start mit der C#-Methode.

Daher wäre mein Kandidat die Eigenschaft _UseShellExecute _, aber egal bei welchem gesetztem Wert, die Meldung kommt trotzdem.

08.10.2007 - 12:01 Uhr

Hallo, ich habe wohl ein ähnliches Problem wie Metty:

Nach dem Extrahieren sind am Anfang der Executable 4 zusätzliche Bytes hinzugekommen, wodurch sie nicht mehr ausführbar ist, ansonsten ist sie identisch.


ResourceReader resReader = new ResourceReader(Assembly.GetAssembly(this.GetType()).GetManifestResourceStream("encrypter.resources"));

string resourceType = String.Empty;
byte[] resourceData;

resReader.GetResourceData("encryptExe", out resourceType, out resourceData);
            
using (System.IO.FileStream fs = new System.IO.FileStream("bubu.exe", FileMode.Create))
{
                fs.Write(resourceData, 0, resourceData.Length);
                fs.Flush();
}

Wenn ich die überschüssigen Daten per


byte[] writeData = new byte[resourceData.Length - 4];
Array.Copy(resourceData, 4, writeData, 0, resourceData.Length - 4);

entferne, lässt sich die Exe ausführen.

Die zusätzlichen Byte sind im angehängten Bild zu sehen.

01.10.2007 - 14:14 Uhr

Original von boonkerz
Hallo,

Wie würdet ihr ein Customer z.b. an verschiedene Gruppen binden?

Ich dachte da an ein Treeview wo mann mit strg mehrere selektieren kann.

Hat das schon mal jemand mit nhibernate gemacht?

MFG

Eigentlich so wie du es beschrieben hast, aber ob man dabei Hibernate verwendet oder nicht macht hierbei meiner Meinung nach keinen Unterschied.

Ich benutze beispielsweise die Technik Verzögertes Laden von Daten im TreeView und zeige alles Werte aus der Master-Tabelle an. Wenn nun ein Knoten expandiert werden soll, werden mit dem selektierten Master-Wert die Child-Daten per Hibernate gelesen. Die Business-Schicht wandelt die dabei die Objekte in simple Stringlisten um, damit die Präsentationsschicht von den Details der Implementierung geschützt ist.

28.09.2007 - 12:30 Uhr

Ja, mein Fehler, ich dachte es wäre das Datenbank-Mapping gemeint.

Dann kann ich dir leider nicht weiterhelfen, da ich selber bisher nur Win32-Anwendungen mit NHibernate benutzt habe.
Die gröbste Suchmethode die ich hierbei gefunden habe, um ein Verzeichnis nach Mapping-Dateien abzuschen, ist die Methode AddDirectory():

Read all mapping documents from a directory tree. Assume that any file named *.hbm.xml is a mapping document.

 
Configuration _config = new Configuration();

_config.Configure("hibernate.sql2005.cfg.xml");

DirectoryInfo di = new DirectoryInfo(@"c:\MeineMappingDateien");
_config.AddDirectory(di );

Aber wie du selbst beschrieben hast, verwendet man bei Win32 eher die "eingebettete Variante".

28.09.2007 - 11:09 Uhr

Wenn es als Alternative in Frage käme, das Laden im Programm anstatt in der web.config anzugeben, dann könntest du es so machen:



ISessionFactory sf = new Configuration()
    .Configure("/path/to/config.cfg.xml")
    .BuildSessionFactory();


Eventuell auch den absoluten/relativen Pfad als Eigenschaft in die web.config schreiben und diesen dann benutzen, um bei einer Konfiguration per XML-Datei zu bleiben:

http://www.mycsharp.de/wbb2/thread.php?threadid=44157

27.09.2007 - 14:08 Uhr

verwendetes Datenbanksystem: im Beispiel MS SQL Server2005, aber wegen des OR-Mappers eigentlich unwichtig

Da ich in künftigen Applikationen eine saubere Trennung zwischen Daten - Logik - Präsentation haben möchte, habe ich mir ein Beispielprojekt erstellt. Also eigentlich etwas, dass jeder Programmierer ab einer bestimmten Projektgröße brauchen kann.

Im Zuge dessen habe ich gleich beschlossen NHibernate zu verwenden - die grundsätzlichen Vorteile davon wurden in diesem Forum oft genug geschildert.

Angehängt ist die Aufteilung der Projektmappe:

Presentation (Anwendung)
Ist abhängig von der darunterliegenden BLL-Schicht
Beinhaltet die derzeit ausgewählte Datenbank-Konfiguration: hibernate.sql2005.cfg.xml

In dieser Schicht wird gegen das Interface aus der BLL programmiert, um die konkrete Implementation später austauschen zu können.
________________________________________

Business Logic Layer (Klassenbibliothek)
Ist abhängig von der darunterliegenden DAL-Schicht. Nur hier wird die NHibernate-Assembly referenziert.

Die Validierung der Benutzereingaben geschieht auch in dieser Schicht, die Windows-Form wird soweit wie möglich von Geschäftslogik freigehalten, aber aus Bequemlichkeit kann dies immer wieder mal vorkommen. Darum die Frage, ob es hierfür ein best practice gibt?
________________________________________

Data Access Layer (Klassenbibliothek)
Keinerlei Abhängigkeiten, beherbergt die Objekte mitsamt den zugehörigen Hibernate Mapping-Beschreibungen.
________________________________________

Zur Aufbau der NHibernate-Konfiguration habe ich folgendes Tutorial verwendet: Part1 + Part2

Nun wurde im zweiten Teil empfohlen, um NHibernate optimal zu nutzen, den Konfigurationsteil in eine statische Klasse zu packen. Dies erscheint auch durchaus sinnvoll, damit nicht mehr als eine SessionFactory benutzt wird, zumindest solange eine Datenbank pro Programm ausreicht.


static Configuration _config = null;
static ISessionFactory _factory = null;
static ISession _session = null;

        static OptimisticUserManager()
	 {
                _config = new Configuration();
                _config.Configure("hibernate.sql2005.cfg.xml");

                Assembly tPluginAssembly = Assembly.LoadFrom("DataAccessL.dll");
                _config.AddAssembly(tPluginAssembly);

                _factory = _config.BuildSessionFactory();
                _session = _factory.OpenSession();
	  }

Da das ganze als Ausgangspunkt für zukünftige DB-Projekte dienen soll, würde ich mich um Verbesserungen der Architektur auf dieser noch simplen Ebene sehr freuen.

Jede zusätzliche Abstraktion wäre ein Gewinn für spätere Projekte, die ja beliebig geartet sein könnten.

24.09.2007 - 16:42 Uhr

Ein Profiler-Tool könnte dir möglicherweise weiterhelfen, etwa das kostenlose ProfileSharp.

Neben dem normalen Performance-Modus, der dir anzeigt in welchen Funktionen dein Programm die meiste Zeit verweilt, gibt es auch einen Memory-Modus zur Suche von Speicherlöchern.

Bei der Gelegenheit stellt sich die Frage, ob es in C# einen new_handler wie bei C++ gibt 🙂

21.09.2007 - 11:55 Uhr

Als Webseitenentwickler hat man es nicht einfach.

Man will nicht die uralte Tabellentechnik für Layoutaufgaben benutzen, aber bei CSS gibt es derart viele Inkonistenzen wenn man nicht nur die aktuellsten Browserversionen unterstützen will.

Daher habe ich mich für mein nächstes Projekt das YAML-Framework ausgewählt, in das CSS-Profis ihre Erfahrungen eingebracht und damit eine Menge Browser-Hacks bereits berücksichtigt haben.
Es ist zwar auf spaltenartige Layouts ausgerichtet, aber für die Standardseiten genügt das vollends.

18.09.2007 - 16:55 Uhr

Auch wenn der Ansatz wohl zu naiv ist, aber was spricht gegen Verwendung des Hashcodes des Namens, wie er von der String-Klasse generiert wird.

17.09.2007 - 09:23 Uhr

Da eine Filmempfehlung erst zählt, wenn sie öfters genannt wird, finden sich bei mir auch ein paar Dupletten 🙂
*Die Tiefseetaucher *Der Maschinist *Apocalypse Now Redux *Brazil *Sunshine *Dancer in the dark *Dogville *The Queen *Fight Club *The Doors *Komm süßer Tod *Vergiß mein nicht *The number 23 *Gilbert Grape *Memento

06.09.2007 - 14:19 Uhr

Hallo bitchei,

da du explizit Aequitas als Beispiel genannt hast, gehe ich davon aus, dass du Screenshots bei Spielen erstellen möchtest. Also zum Zwecke des Cheatnachweises.

Diese verwenden aber meist DirectX/3D oder OpenGL zur Darstellung, und nicht das GDI-Framework.

Daher von mir die Frage, ob der obige Code sich dazu eignet von beliebigen "Oberflächen" Screenshots zu erstellen.

06.09.2007 - 11:36 Uhr

Glückwunsch 😉

Woher beziehst du die Stammdaten für dein Geographieprogramm?

Benutzt du vielleicht OpenGeoDB oder eher was kommerzielles?

05.09.2007 - 14:40 Uhr

Wie ist diese Frage gemeint?

Wenn du beispielsweise mit deinem Programm Orte auf einer Deutschlandkarte anzeigen willst, dann mußt du dir eine passende Karte besorgen.
Man sollte sich bei "geliehenen" Grafiken jedoch auf freie Versionen beschränken sonst fängt man sich auch noch eine Klage ein.

Wikipedia.org bietet freie Grafiken, aber für Geobelange eine sehr magere Auswahl.
Beispielsweise eine Deutschlandkarte

Und dann entsprechend die Maxima der Karte (Links, Rechts,Oben,Unten) in deinem Programm mitgeben, damit eine Skalierung erfolgen kann.

05.09.2007 - 11:14 Uhr

Hallo,

find ich lustig, dass dieser "alte" Thread wiederbelebt wurde 🙂

Ich habe mir damals eine (mehr schlecht als rechte) Funktion geschrieben, die als Eingabeparameter zwei Klassen erwartet, die im Grunde nur die zwingend notwendigen Daten kapseln.

GeoPoint point = Geographischer Punkt aus deiner Datenbank mit Längen- und Breitengrad.

GeoMap map = Geographische Daten deiner ausgewählten Karte. Desto genauer du die Extremwerte der Karte bezüglich Längen- und Breitengrad weißt, desto genauer sollte der angezeigte Punkt in der Karte werden.


        public static Point ScaleToScreen(GeoPoint point, GeoMap map)
        {
            double diff = map.Max.Longtitude - map.Min.Longtitude;
            double fact = map.SizeX / (diff);
            double plocal = (point.Longtitude - map.Min.Longtitude);
            double x = plocal * fact;

            diff = map.Max.Latitude - map.Min.Latitude;
            fact = map.SizeY / (diff);
            plocal = (point.Latitude - map.Min.Latitude);
            double y = plocal * fact;

            return new Point(Convert.ToInt32(x), Convert.ToInt32(y));
        }

09.03.2007 - 11:17 Uhr

Hi,

hier gäbe es ein zumindest teilweise verständliches Tutorial für das Hinzufügen von signierten Manifesten: [CodeProject]

01.03.2007 - 13:27 Uhr

So ein dummes Problem 🙂

Trotz deiner Versicherung meldet VS bei mir weiterhin diesen Fehler einer nicht behandelten Ausnahme.

Nach kurzzeitigem Rumprobieren ist der Grund bekannt:
Wenn ich das Programm mit VS2005 + Debuginformationen ausführe, stoppt VS in der Zeile wo die Ausnahme geworfen wird und geht dann erst weiter.

Ohne Debuginformationen bekommt man von der Ausnahme keine Fehlermeldung zu sehen.

01.03.2007 - 11:49 Uhr

Genau so habe ich es laut MSDN auch verstanden.

Aber wenn ich in backgroundWorker1_DoWork eine Exception werfe, kommt zur Laufzeit die Fehlermeldung, dass die geworfene Exception nicht vom Benutzercode behandelt wird.

Dies würde wiederum zu svensons Aussage passen "Exceptions bleiben immer in dem Thread, in dem sie geworfen werden.".

01.03.2007 - 09:46 Uhr

Original von svenson
Exceptions bleiben immer in dem Thread, in dem sie geworfen werden. DoWork läuft im Thread aus dem Thread-Poool. Der Completed-Event im Aufrufer-Thread. Du muss dir das Exception-Objekt in DoWork fangen und "merken" und im COmpleted-Event abfragen und im Error eintragen.

Laut MSDN frägt man so auf einen Fehler nach der Ausführung des Backgroundworkers ab:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // First, handle the case where an exception was thrown.
    if (e.Error != null)
    {
        MessageBox.Show(e.Error.Message);
    }

Aber wie "merke" ich mir das?
In der Arbeitsfunktion hat die DoWorkEventArgs-Klasse die modifizierbaren Eigenschaften Result, Cancel und Argument. Aber keine Error-Eigenschaft, die ich setzen könnte.

21.02.2007 - 14:10 Uhr

*EDIT* Schreibfehler! Assemblyname stimmt also doch 🙂

Es hat zwar ein paar Tage gedauert, aber inzwischen läuft die Publish/Subscribe-Umgebung per Remoting wie geschmiert g.

Allerdings möchte ich jetzt wegen größerer Flexibilät in Bezug auf das Transportprotokoll von hardkodierten Channels auf Konfigurationsdateien umsteigen.

Dabei bereitet mir aber der Parameter **type **beim Tag **wellknown **Schwierigkeiten 🙂


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.runtime.remoting>
    <application name="MyRemoteService">
      <service>
        <wellknown
            mode="Singleton"
            type="RemoteObject.RemoteMessage, RemoteMessageLibrary"
            objectUri="Warteschlange"
                />
      </service>
      <channels>
        <channel ref="tcp" port="8090" displayName="TCP Channel" />
        <serverProviders>
          <formatter ref="binary" typeFilterLevel="Full" />
        </serverProviders>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

Laut MSDN ist dabei die Parameterliste wie folgt zu füllen:

type="RemoteType, RemoteAssembly"

Der Typ ist ja noch verständlich, aber was ist genau beim RemoteAssembly anzugeben?
Bislang habe ich es mit dem Namen der DLL probiert, die das RemoteObject beinhaltet, dies wird aber mit folgendem Fehler quittiert:

15.02.2007 - 11:18 Uhr

Hallo, ich habe ein ganz gewöhnliches IPC-Szenario aufgesetzt (festgelegt auf Net 2.0):

Servercode:

      
IpcServerChannel serverChannel = new IpcServerChannel("Warteschlange");
ChannelServices.RegisterChannel(serverChannel, true);

RemotingConfiguration.RegisterWellKnownServiceType( typeof(RemoteQueue), "RemoteQueue",  WellKnownObjectMode.Singleton);

Clientcode:


ChannelServices.RegisterChannel(new IpcClientChannel(), true);
RemotingConfiguration.RegisterWellKnownClientType(typeof(TransformaterQueue.RemoteQueue),"ipc://Warteschlange/RemoteQueue");
RemoteQueue rq = new RemoteQueue();

Dies funktioniert auch, der Client kann auf das RemoteObjekt zugreifen und ändern.
Ich will nun aber auch, dass der Server ebenfalls das Objekt ändern kann. Dies sollte meiner Meinung nicht schwer sein, da er das Objekt selbst anbietet.

Folgende angedachte Variante funktioniert leider nicht. Der Code folgt direkt dem Erzeugen des IPC-Kanals auf dem Server:
a)


RemoteQueue rq = (RemoteQueue)Activator.GetObject(typeof(RemoteQueue),
                                    "ipc://Warteschlange/RemoteQueue");

rq.Hinzu("dfdf"); // <-- Diese Zeile bewirkt dann den Fehler

Im Anhang findet sich die mir völlig unverständliche Fehlermeldung 🙂

14.10.2006 - 11:12 Uhr

Hallo,
ich habe eine Client-/Server-Anwendung erstellt, welches .NET 2.0 Remoting verwendet.
Der Server ist rein konsolenbasiert und er soll nun auch unter Linux funktionieren.

Und um den Benutzer vor einer manuellen Installation der Monobibliotheken zu bewahren, möchte ich die mono-Bibliotheken in die ausführbare Datei hineinkompilieren.

Um vielleicht meine Absicht ein wenig deutlicher zu machen, hier ein Beispiel von der Skype-Homepage:

http://www.skype.com/download/skype/linux/

Die letzte Option: Static binary tar.bz2 with Qt compiled in
Bei diesem Paket muß der Benutzer kein Qt installiert haben, weil es sich bereits in der ausführbaren Datei befindet.
Soweit ich weiß, kann man bei der Win32-MFC-Programmierung etwa auch die MFC-Bibliotheken statisch in sein Programm hineinkopieren.

Daher meine direkte Frage, ob jemand weiß, wie ich dies mit Mono erreichen kann

28.09.2006 - 16:36 Uhr

Werden inzwischen bei mono das .NET 2.0-System der Konfigurationsdateien unterstützt?

<namespace>.Properties.Settings mySettings = new <namespace>.Properties.Settings();
..
..
mySettings.Save();

Ich finde diese Methodik einfach sauber und elegant. Und besonders für Linux, wo es keine Registry gibt, wäre die Unterstützung eine Erleichterung bei der Entwicklung.

Wenn ich zudem eine C# - Anwendung für Linux verteilen möchte, dann kann das nur in Quelltextform Sinn machen oder?
Da die verschiedenen mono-Version meines Verständnisses nach zueinander inkompatibel sind, z.B. kompiliert mit 1.1.3498348 und auf dem Zielsystem befindet sich 1.1.854582.

Oder gibt es vielleicht die Möglichkeit die mono-Bibliothek statisch in die ausführbare zu linken?

25.09.2006 - 21:09 Uhr

Da ich gerade vor dem gleich Problem stand, hab ich mir die Doku zu PostMessage angeschaut und viel fehlte nicht zur richtigen Funktionsweise 🙂

PostMessage(hWnd.ToInt32(), WM_KEYDOWN, 0, VK_RETURN);
PostMessage(hWnd.ToInt32(), WM_KEYUP, 0, VK_RETURN); 

ändern in

PostMessage(hWnd.ToInt32(), WM_KEYDOWN, VK_RETURN, 0);
PostMessage(hWnd.ToInt32(), WM_KEYUP, VK_RETURN, 0); 
25.09.2006 - 15:03 Uhr

Da hier anscheinend gerade die Spezialisten in Sachen Längen- und Breitengraden zusammengekommen sind, erlaube ich mir auch schnell eine Zusatzfrage 🙂

Zur Entfernungsberechnung zwischen 2 Städten verwende ich folgende Formel:

Entfernung = arccos(sin(B_lat)*sin(A_lat)+cos(B_lat)*cos(A_lat)*cos(B_lon - A_lon)) * Erdradius

So weit, so gut. Nun möchte ich eine Umkreissuche hinzufügen.
Dafür muß ich eine gegebene Entfernung zu einer Stadt (z.B. 30km) in einen Kleinkreis umrechnen.
Also eine kreisrunde Fläche auf einer Kugelgeometrie.

Mein Ansatz wäre nun gewesen die obige Formel umzustellen, aber dazu reicht mein Mathematik-Verständnis leider nicht aus :

Daher wäre ich um Unterstützung dankbar, die mir bei der Berechnung hilfreich ist.

25.09.2006 - 11:02 Uhr

Inzwischen habe ich eine Applikation auf Basis der freien OpenGeoDB gebastelt. Die Geodaten im CSV-Format habe ich in eine Excel-Datei importiert und diese per OLEDB an mein Programm angebunden.

Die Karte und die Städte darauf werden manuell gezeichnet, auch die Umrechnung von Längen-/Breitengraden in Pixelkoordinaten klappt ganz gut.
Nur mit der Umkreissuche habe ich noch Probleme, da dies höhere mathematische Kenntnisse erfordert ( Kleinkreis ).

Daher möchte ich als nächstes den MapPoint Web Service ausprobieren, wobei ich mir mal einen kostenlosen Testaccount bei MS geholt habe. Auch die Beispiele im SDK machen einen einsteigerfreundlichen Eindruck. Die Beispiele sind auch hauptsächlich in Applikationsforms gemacht, nicht in den für mich uninteressanten ASP.NET-Code. Bin mal gespannt ob dieses SOAP-Zeugs wirklich so toll ist, wie alle immer sagen 🙂

Map&Guide lasse ich mal außen vor, weil der Testaccount für 30 Tage hier 49€ kosten würde 🙂

19.09.2006 - 13:30 Uhr

Hallo,

zunächst zur Ausgangslage: Ich möchte in einer Applikation Kundenstandorte in einer Europa-/Deutschlandkarte visualisieren. Zusätzlich sollen auch Entfernungsberechnungen möglich sein. Wichtigte Punkte sind die zeichnerische Darstellung sowie das Eintragen von Koordinaten-Markierungspunkten.

Mein Problem ist nun die Auswahl des richtigen Anbieters bzw. Frameworks. Die meisten Lösungen basieren auf Webanwendungen mit AJAX/Javascript. Die Anwendung sollte aber im seltenen Fall auch ohne bestehende Internetverbindung lauffähig sein.

Von Microsoft selbst, werden zwei Lösungen angeboten, von denen aber die Standaloneversion MapPoint 2006 schon ausscheidet, weil hier jeder User anscheinend eine eigene MapPoint-Lizenz bräuchte.
MapPoint 2006
MapPoint Web Service
Die Schnittstellen sind gut dokumentiert und natürlich auch für C#/.NET gedacht. Allerdings habe ich noch keinerlei Erfahrungen mit diesen Produkten. Daher wäre es hilfreich, hier von Erfahrungen zu hören, ob sich das zu investierende Geld auch lohnen würde.

Apropo Geld: Wie ist die Bezahlung beim MS Web Service gehandhabt, finde dazu keine genaueren Informationen auf der Seite. Gibt es einen festen Betrag oder ist es volumenabhängig?

Gibt es auch eine Möglichkeit die Produkte offline zu verwenden, indem man Geodaten vorher in eine Datei bzw. eine DB schreibt?

Desweiteren habe ich mir noch die freie OpenGeoDB näher angesehen.
Damit ist auch ein Dump der Datenbasis möglich, allerdings kann mir jemand sagen, wie zuverlässlich diese Daten sind. Sie sind schließlich frei zugänglich und damit wohl auch nicht vor Mißbrauch geschützt.
Programmiertechnisch finde ich dazu nur ein freies PHP-Skript, welches erst noch auf C# portiert werden müßte.

Zuletzt noch Map&Guide.
Ein deutscher Anbieter wäre für europäische Geodaten bestimmt auch keine schlechte Wahl, allerdings finde ich zu API/programmiertechnischen Fragen keine Informationen auf der Seite.
Hat deshalb mit diesem System schon jemand gearbeitet?

Falls alle von mir dargebotenen Lösungen nicht passen sollten, spräche etwas gegen die Darstellung von Onlineinhalten in einem Web-ActiveX?
Bin über jeden Informationshappen dankbar 🙂

14.09.2006 - 16:23 Uhr

BeginInvoke bringt leider auch keine Geschwindikgeitsverbesserung:


...
object[] myArray = new object[2];
myArray[0] = node;
myArray[1] = "TEXT";
node.TreeView.BeginInvoke(new MyDelegate(DelegateMethod), myArray);
...


public delegate void MyDelegate(TreeNode node, string myArg);

public void DelegateMethod(TreeNode myControl, string myCaption)
{
       myControl.Text = myCaption;
}

Für 300 Textänderungen (soviele Einträge sind in der entsprechenden Ebene im TreeView) braucht er 40 Sekunden (Und nein, ich sitze nicht an einem 486 😁 )

14.09.2006 - 15:59 Uhr

Original von cadi
Ich habe mir mal angeschaut, wie TreeView.BeginUpdate und TreeNode.set_Text implementiert sind.
Beide senden eigentlich nur eine Message an das native Windows TreeView Control.

D.h. die Performance ist eigentlich nur von der MessagePump abhängig.

Hast du irgendwelche Delegates o.ä. die die MessagePump blockieren könnten?

Nein, bislang wird keine Art von Delegates/Threads verwendet.

Original von cadi
Mal versucht mit BeginInvoke asynchron den Text zu ändern?

Das wird mein nächster Ansatz sein.

Original von cadi
Und was ganz anderes: Testest du ein Release oder Debug build mit oder ohne VisualStudio? Das kann zu extremen Verzögerungen alleine durch das VisualStudio kommen!

Evtl. man ein Release Build mit STRG+F5 starten und sehen, was passiert!

Nach 16 Stunden an einem Problem hab ich dies natürlich schon gemacht, aber die Zeitdifferenz von 40 Sekunden ändert sich dadurch nicht.

Wahrscheinlich muß man erst Assembler lernen, um dieses Problem zu lösen X(

14.09.2006 - 15:14 Uhr

Vor und nach dem Zugriff habe ich die Tabelle für einen Repaint eigentlich gesperrt. Gäbe es vielleicht noch andere Möglichkeiten, das Zeichnen zu verhindern, um dies auszuschließen?


tvTables.BeginUpdate();
tvTables.SuspendLayout();

..work..

tvTables.ResumeLayout();
tvTables.EndUpdate();

14.09.2006 - 14:22 Uhr

Danke für dein Angebot, herbivore, und ich habe auch ein neues Programm angelegt welches die gleichen Routinen für das Füllen des TreeViews benutzt. Seltsamerweise tritt hier der langsame Zugriff nicht auf.

Für mein ursprüngliches Problem habe ich inzwischen einen "Workaround" gefunden, der zwar funktioniert, aber wirklich schrecklich aussieht 🙂

Nochmal zur Verdeutlichung. Hier die unerträglich langsame Variante:


node.Text = "NEUER TEXT";

Ich ändere nun den Text einer TreeNode mithilfe folgender Funktion, welche wieder im Millisekundenbereich operiert.


...
SpecialChangeNodeText(ref node,"NEUER TEXT");
...

public void SpecialChangeNodeText(ref TreeNode node, string text)
{
	TreeNode clonedNode = (TreeNode )node.Clone();
	clonedNode.Text = "NEUER TEXT";
	node = clonedNode;
}

Vielleicht hilft dies jemanden, eine Ahnung vom eigentlichen Problem zu entwickeln.

14.09.2006 - 08:35 Uhr

Auch wenn ich den Glauben an eine Lösung schon aufgegeben habe, hier noch ein Sahnestück zum Thema:

Die erste Zuweisung benötigt die beschriebene lange Zeit von ~0.1 Sekunden, der zweite Zugriff braucht dagegen dann wieder eine unerhebliche Zeit im Millisekundenbereich.


node.Text = "Hallo1"; // LANGE
node.Text = "Hallo2"; // RASEND SCHNELL

13.09.2006 - 15:43 Uhr

Hallo,

ich stelle in einem TreeView einen umfangreichen Baum dar.

Für eine gewisse Ebene im Baum habe ich mir eine von TreeNode abgeleitete Unterklasse mit einem zusätzlichen Double-Feld geschrieben.

	
public class AuditNode:TreeNode
	{
		private double coverage;

		public AuditNode() : base()
		{
		}

		public AuditNode(string text) : base(text)
		{
		}

		public double Coverage
		{
			get 
			{
				return coverage;
			}
			set 
			{
				coverage = value;
			}
		}
	}

In einer späteren Funktion caste ich mir einen TreeNode als AuditNode und möchte damit arbeiten.

AuditNode workNode = currentNode as AuditNode;

Und nun zum Unerklärlichen:

Eine Zuweisung an workNode.Text braucht etwa 0.06 Sekunden, es spielt dabei keine Rolle ob ich


workNode.Text = "dfdf";

oder


workNode.Text = null;

mache. Und 0.06 Sekunden sind in maschinenzeit ja schon gravierend, besonders wenn die Stelle wiederholt aufgerufen wird.

Ich habe ein paar Zeitmessungen im Code eingebaut und ein Programmdurchlauf, bei dem ein Zugriff auf workNode.Text ein paar hundertmal vorkommt, ergibt eine veränderte Programmlaufzeit von 40 Sekunden.
Wenn ich diese Zeile dagegen auskommentiere, komme ich auf 5 Sekunden.

Wenn ich nur lesend zugreife, verschlechtert sich die Zeit auf 8 Sekunden. Wobei im Programmcode sehr viele Konsolenausgaben enthalten sind, die an der Laufzeit keinen meßbaren Effekt haben.

Console.WriteLine(node.Text);

Um die Sache noch verwirrender zu machen, verschlechtert folgender Aufruf an gleicher Stelle die Laufzeit nicht.


workNode.Tag = null;

Falls jemand einen Ansatz zur Auflösung des Problems hat, wäre ich sehr dankbar. Auch vorgeschlagene Tests führe ich gerne durch 🙂

12.09.2006 - 16:27 Uhr

Wäre zumindest billiger als ein Umstieg auf VS2005 🙂

12.09.2006 - 12:37 Uhr

Original von talla
Du kannst die Funktion RemotingServices.Marshal dazu verwenden, dem Server ein bestimmtes Objekt mitzugeben das er als remote Objekt zur Verfügung stellen soll.

Danke talla,
das ist genau die Funktion, die ich gesucht habe. Hat auf Anhieb funktioniert.

12.09.2006 - 12:24 Uhr

Gibt es bei VS2003 dieses tolle Feature auch schon?

12.09.2006 - 11:02 Uhr

Original von svenson
Der Server ist IMMER derjenige, der das Objekt modifiziert. Der CLient greift ja nur über einen Proxy zu. Wenn du im Server noch einen Thread hast, der die Objekte manipuliert, musst du nur das beachten, was man im Allgemeinen bei Threads und Datenzugriff beachten muss, nämlich Synchronisation.

Ok, das ist ja schon mal sehr gut, aber wie bekomme ich diesen Zugriff technisch hin?
Wenn ich nach der Registrierung

				RemotingConfiguration.RegisterWellKnownServiceType(typeof(InstantServer.RemoteUsers), "Userliste", WellKnownObjectMode.Singleton);

ein

InstantServer.RemoteUsers r = new InstantServer.RemoteUsers()

erzeuge, hat dieses meines Erachtens doch nichts mit dem registrierten Singleton-Objekt zu tun, auf welches die Clients Zugriff haben. Dann würde doch ein neues Objekt im Speicher angelegt werden, deshalb muß es wohl eine Methode geben die die Adresse des bestehenden Singletons zurückliefert.

12.09.2006 - 09:38 Uhr

Ich bin gerade dabei .NET Remoting bei einem Projekt erstmalig zu verwenden, bei dem Client / Server hauptsächlich über das Internet miteinander kommunizieren.
Von C++ bin ich Sockets gewohnt, daher habe ich mich mal für was "modernes", sprich OO-zentrierteTechnik, entschieden 🙂

P.S. Das Video zu Remoting bei .NET TV ist übrigens einsame Klasse, dieses hat mich wohl am ehesten von Remoting überzeugt.

Auf dem Server liegt ein Singleton-Objekt, welches sich alle Clients teilen, alles sehr nahe am Referenzcode der MSDN.
Dies funktioniert bislang einwandfrei und war auch sehr einfach zu programmieren. Ich mußte mir zumindest noch kein Pseudo-Protokoll ausdenken, wie es sonst bei Low-Level-Sockets nötig ist.

Nun stöße ich allerdings auf erste Schwierigkeiten:

Frage 1:
Laut Web/Büchern soll man den HTTP-Channel verwenden, weil er im Gegensatz zum TCP-Channel keine Probleme mit Firewall/Proxys hat. Trotzdem müssen Anwender mit Router den entsprechenden Port freischalten.
Das ist fast logisch, außer man hätte eine von Skype angelehnte Vorgehensweise um die Ports offen zu kriegen. Daher sehe ich jetzt nicht ein, was beim HTTP-Channel außer der Binary-Formatierung anders gemacht wird.

Frage 2:
Das zweite Problem bezieht sich auf den Server, der das Singleton-Objekt verwaltet.

HttpServerChannel myChannel = new HttpServerChannel(64215);
	ChannelServices.RegisterChannel(myChannel);
Type typ = typeof(InstantServer.RemoteUsers);
	RemotingConfiguration.RegisterWellKnownServiceType(typ, "Userliste", WellKnownObjectMode.Singleton);

Der Server stellt das Objekt zur Verfügung und damit hat es sich auch. Aber wenn es jetzt der Server selbst das Objekt beeinflussen möchte, wie ist dann vorzugehen.
Muß er dazu selbst einen ClientChannel zu sich selbst öffnen? Das wäre zumindest konsequent 🙂
Die andere Möglichkeit könnten Delegates sein, aber in anderen Topics zum Thema steht viel darüber dass diese Schwierigkeiten verursachen sollen.

Frage 3:
Den konsolenbasierten Servercode habe ich bereits unter Mono 1.1.13 auch testweise unter Linux kompiliert. Der Server läuft und ich konnte mich auch von Windows aus dahin verbinden.
Mono ist soweit ich weiß aber noch .NET 1.1. Wenn ich nun aber den Client in .NET 2.0 bzw. Funktionen daraus verwende, sollte das dann noch funktionieren? Gibt es eine Rückwärtskompatibilität in diesem Bereich?

07.09.2006 - 10:26 Uhr

Ok, der Fehler mit dem Connectionstring ist nun bereinigt. Es lag an einer falschen Setzung der Anführungszeichen. Vorher zählte er den Parameter nicht zu den Extended Properties sondern als eigenständigen Parameter. Danke Syrinx + Rainbird.

Statt

string conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Extended Properties=Excel 8.0;HDR=No;";

muß es

string conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Extended Properties=\"Excel 8.0;HDR=No;\"";

heißen.
Und die Fehlermeldung "Installierbares ISAM nicht gefunden" kommt anscheinend bei jeglichem Fehler im Connectionstring.

Damit kann ich die Verbindung nun mit dem Parameter HDR=No öffnen. Jetzt geht es nur noch darum, diese neue Möglichkeit auch auszuschöpfen.
*malallesmöglicheausprobier* 🙂

*UPDATE*
Wie gewünscht, genügt nun ein einfacher SELECT * FROM [Tabelle1$].

06.09.2006 - 15:41 Uhr

Wenn man sich nun aus architektonischen Gründen für ein Singleton entscheidet kann es doch Probleme beim gleichzeitigen Schreibzugriff von mehreren Clients auf das Singleton-Objekt geben. Auch könnte ein Client das Objekt gerade beschreiben, während ein anderer liest.

Wie ist dieses bei Threads ja hinlänglich bekannte Problem bei Remoting-Singletons bewältigt?

06.09.2006 - 13:18 Uhr

Ich habe inzwischen folgende Möglichkeit beim ConnectionString gefunden, welche für mein Problem ideal zu passen scheint:

&quot;HDR=Yes;&quot; indicates that the first row contains columnnames, not data

Bislang sieht mein ConnectionString folgendermaßen aus:

string conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Extended Properties=Excel 8.0;";

Wenn ich ihn allerdings um HDR=Yes ergänze zu

string conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Extended Properties=Excel 8.0;HDR=Yes;";

Dann wird mir beim Öffnen der Verbindung folgende Fehlermeldung entgegengeschickt:

Installierbares ISAM nicht gefunden

Testweise habe ich auch den anderen noch möglichen Parameter ISAM=1 getestet, daraufhin erscheint die gleiche Fehlermeldung.

Bei der Forum/Google-Suche erhalte ich nur Informationen über irgendwelche VB6-Controls (MDAC) und ähnliches. Kann den auf einem modernen PC auf dem VS2003 installiert sowas fehlen?

Was will diese Fehlermeldung überhaupt von mir? 😁

*NACHTRAG*
Mit den gegenteiligen Werten: HDR=No bzw. IMEX=0 kommt die Fehlermeldung trotzdem. Das übersteigt mein OLEDB-Verständnis bei weitem X(

06.09.2006 - 08:33 Uhr

Hallo,

ich habe zuerst eine rein schulische Ausbildung zum Fachinformatiker gemacht und danach erst einmal 3 Jahre als C-Programmierer gearbeitet. Dabei war ich auch mit diplomierten Leuten im Team und der Unterschied war in manchen Bereichen schon eklatant.
Ein Uni-Absolvent konnte eine Grafikkarte nicht von einer Soundkarte unterscheiden, was für einen Projektleiter schon sehr merkwürdig ist🙂 Auch verdienten diejenigen mit akademischen Grad annähernd das Doppelte von meinem Gehalt.

Da habe ich mir gedacht, so abgedreht will ich auch werden!
Rasch gekündigt, auf der BOS das Abitur nachgemacht und nun studiere ich Informatik an einer FH (3. Semester).

Ich bereue meine Ausbildung zum FiAE keinesfalls, die Programmierkenntnisse die ich da gelernt habe, kommen mir nun beim Studium sehr zugute. Die "Anfänger" werden beim Studium erstmal mit abstrakten Konzepten wie Automatentheorie erschlagen. Wenn man dagegen zuvor schon aktiv war, kann man sich schon einen Reim darauf machen, was die Professoren von einem wollen.

Und das Wissen in Mathematik das einem beim Studium zu Teil wird, ist einfach Gold wert. Ich fand Mathe auf der BOS schon sehr interessant, doch an der FH wird man mit Fourier-, Taylorreihen und komplexen Zahlen vollgestopft.
Das sind Sachen die man sich meiner Meinung nach nur schwer im Selbststudium beibringen kann und man doch bei nichttrivialen Problemen im Berufsalltag gebrauchen kann. Praktisch relevant sind etwa RSA-Verschlüsselung, Prüfsummen oder Operationen in Vektorräumen.

Was mich allerdings stört, ist der Mangel an Programmiersprachen der beim Studium vorherrscht. Als FaAE lernt man grob geschätzt 6-8 Sprachen: C++,Java,VB,Cobol,PHP,...
Im Studium dagegen größtenteils nur Java, die typische Studentensprache eben.
(P.S. Nur gut dass sich C# und Java so ähnlich sind 😉 )

Zum Thema Bachelor und Master würde mich interessieren, wer hier noch einen Master dranhängen möchte? Weil dadurch würde sich ein Studium nochmals um etwa 3 Semester verlängern, worauf ich nun wirklich keine Lust habe. Wenn dann schon neben dem Beruf ableisten, wenn das möglich ist.
Doch leider gibt es zumindest an meiner FH noch zuwenig Informationen dazu, weil erst vor kurzem von Bachelor auf Diplom umgestellt worden ist.

05.09.2006 - 15:56 Uhr

Hi, bin selber gerade dabei mich in das Thema Remoting einzulesen, wobei ich diesen Beispielcode für sehr hilfreich erachte.

05.09.2006 - 08:50 Uhr

Hallo,

bislang verarbeite ich eine Excel-Datei per OLEDB-SQL.
In der ersten Zeile der Excel-Datei stehen die Spaltennamen und jeweils darunter die zugehörigen Werte.
Mein SQL hat also den üblichen Aufbau: SELECT NAME,PLZ FROM [T&]

Nun sollen aber auch Excel-Dateien ohne Spaltenkopf verarbeitet werden können.
Der Benutzer kann also wählen: In Spalte 1 befindet sich der Inhalt für alle Namen.
D.h. in der ersten Zeile befinden sich bereits Nutzdaten.

Mein Problem ist jetzt das Lesen dieser Spalten ohne direkten Namen. Ein erster Lösungsansatz der Form SELECT 1,2,3 FROM [T&] funktioniert leider nicht.

Muß man für die Lösung vielleicht dem OleDbDataReader einen speziellen Parameter verpassen?

31.08.2006 - 09:56 Uhr

Mein Nick stammt aus einem Lied der 70er-Band The Doors und zwar konkret "Not to touch the earth".
Am Ende es Liedes wird folgende Zeile ins Mikro gehaucht: I'm the lizardking, I can do anything.

Vielleicht kennt einer die Simpsons-Folge in der Lisa durch das Wasser im Duffpark leichte Vergiftungen erleidet. Daraufhin entspringen ihr die Worte "Ich bin die Eidechsenkönig". Im Englischen: "I am the Lizard Queen!"
Sehr cool 🙂

30.08.2006 - 11:27 Uhr

Sinus und Cosinus können durch bestimmte Summenformeln, sogenannte Taylorreihen, recht performant angenähert werden.

Beim Sinus in der Form x - x3 / 3! + x5 / 5! - ...
Beim Cosinus in der Form 1 - x2 / 2! + x4 /4! ...

Siehe auch Alternierende Reihe

So macht es meines Wissens auch ein Taschenrechner. Je mehr Reihenglieder du hinzuaddierst, desto genauer wird das Ergebnis.

Pow mit Kommazahlen basiert auf der exp-Funktion

Ohne ein gutes Mathebuch wirst du aber wohl nicht sehr weit kommen 🙂
Empfehlen könnte ich dir folgendes, darin wird genau auf die Berechnung dieser Funktionen mit dem Computer eingegangen.

29.08.2006 - 09:53 Uhr

Vielen Dank, nächstes Mal sehe ich direkt in die FAQ 🙂

29.08.2006 - 09:51 Uhr

Hallo, ich bin neu in C# und hätte direkt eine Frage zu Hashtables.
Beim Framework bin ich noch an .NET 1.1 gebunden.

Wie kann man bei einer gefüllten Hashtable einen Wert herauslesen, wenn man den Key besitzt. Ich finde dazu keine passende Funktion, nur einen kompletten Durchlauf per Enumerator.
Auch per Suchfunktion konnte ich kein passendes Beispiel finden.

Bei Java gibt es für diesen Fall die sprechende Methode .get
Ich bräuchte also nur die Entsprechung bei C# dazu.

28.08.2006 - 10:11 Uhr

Danke für den guten Artikel.
Für einen Umsteiger von C++ wie mich war er sehr hilfreich.