Laden...

Forenbeiträge von zipperle Ingesamt 47 Beiträge

20.11.2011 - 16:37 Uhr

Habe mich jetzt mal etwas in Linq2Xml eingelesen. Das scheint mir ein Lösung zu sein. D.h. ich benötige nicht XSD.exe und die Generierung von c#-code,stattdessen extrahiere ich Teile des XMLs und stecke sie in von mir definierte Typen/Klassenstruktur. Ist doch dann aber ein ähliches Prinzip wie Automapper!? Meine c# Query Texte realisieren dann das Mapping auf meine eigenen Typen. Nur vermtulich einfacher zu programmieren als mit Automapper und etwas flexibler, womit ich wohl das Problem aus Frage b) lösen könnte.

Was mir noch nicht klar ist bei der Lösung mit Linq2Xml, wie ich es hinbekomme mein Objektmodell zurück an den Webservice zu schicken, gemäß dem vom Webservice erwartetem XSD Schema?

Wo hast du auf deiner Seite Relationale Daten?

Ich denke du hast recht, möchte eigentlich nur gewisse Felder aus einem "einfachen" Datensatz extrahieren. Relationale Daten wären es wohl dann, wenn ich aus mehreren unterschiedlichen Datensätzen aus verschiedenen Tabellen etwas abbilden möchte. Das ist bei mir nicht der Fall.

Was Du machen willst ist XML auf ein Objekt zu mappen.

Nicht nur. Ich muss später ein solches Objekt wieder zurück an den Webservice schicken

  1. strenge Typisierung, die man bei Objekten anstrebt kommt immer mit dem "Nachteil" das man neu kompilieren muss wenn sich die Strukturen ändern, wie könnte sonst streng typisiert werden?

Ja das ist mir klar, aber bei meiner Lösung Nr. 3) könnte man wenigstens ein Fehlerhaftes Mapping korrigieren, z.B. falsches Element A aus XML gemapped auf Property X -> korrigiert: Element B gemapped auf Property X. Ok ist fraglich wie wahrscheinlich dieses Szenario ist und ob dies ein gewichtiges Argument für Lösung 3 wäre.

  1. Wenn du veränderliche Daten im XML Format hast, lass sie so und beschäftige dich evtl mit LinQ2Xml.

Wie gesagt mir ist nicht klar wie ich meine Objektstruktur dann zurück in ein Webservice/Schema konformes XML überführen kann.

19.11.2011 - 23:33 Uhr

habe keinen einfluss auf den server/webservice und die gelieferten daten, ich entwickle nur einen client der ein teil der daten wieder in ein anderes system steckt und anders herum auch teile der daten des anderen systems wieder zurück an den webservice.
außerdem würde ein o/r mapper auf dem server nicht mein problem auf der client seite lösen, die vom webservice gelieferten daten in meine datenstruktur zu mappen? wenn dann bräuchte ich doch auch ein o/r mapper auf client seite. oder habe ich da was noch nicht verstanden?

19.11.2011 - 17:47 Uhr

Hi würde gern Eure Meinung hören damit ich die richtige Entscheidung treffe, bin noch neu in dem Theme und habe mir das bisher etwas ergooglet und hier im Forum ein paar Beiträge dazu gelesen 😃

Folgende Situation:
Ich rufe von einem Webservice Daten ab welche aus einer Datenbank stammen. Der Webservice liefert mir die Datansätze in einem CDATA Element als XML. Das Schema zum XML habe ich. Mit XSD.exe habe ich mir die Klassen (Objektstruktur) erzeugen lassen. Zur laufzeit würde ich diese mit XmlSerializer (de-)serialisieren.

Aus einem Datensatz bzw. aus der Objektstruktur benötige nicht alle Klassen/Properties und würde diese in eine eigene von mir definierte Klassenstruktur überführen wollen.

Wie ich bisher recheriert habe, bieten sich mir folgende Möglichkeiten:

  1. Ein ORM Framework:
    Denke das ist aber overkill für meine Anwendung bzw auch nicht geeignet weil ich ja nicht dirket mit der DB kommuniziere sondern über einen Webservice.
    Ist diese Einschätzung korrekt?

  2. Automapper:
    Scheint eine gute Lösung zu sein. Allerdings etwas zu statisch/unflexibel. Wenn nach Auslieferung der Anwendung ein Fehler im Mapping erkannt wird (der beim Testen nicht aufgefallen ist), dann müsste man die Anwendung neu kompilieren. Bin dann evtl zu diesem Zeitpunkt nicht mehr in der Firma tätig und jemand anderes müsste hier den Code kennen bzw. C# Entwickler sein um dies zu ändern.
    Ein weiterer evtl nicht so gravierender Punkt ist, wenn sich das Schema des Xml ändert. Dann müsste ich ja, je nachdem was sich am Schema geändert hat, auch meine eigene Datenklassenstruktur anpassen und neu kompilieren.
    Sind diese Einschätzungen korrekt?

  3. Per Mapping Config Datei und Reflection:
    Diese Lösung hatte ich von Anfang an im Kopf, war mir aber nicht sicher ob realisierbar. In diesem Artikel
    http://www.techrepublic.com/article/applied-reflection-dynamically-accessing-properties-of-a-class-at-runtime/6099345
    scheint die Lösung beschrieben zu sein, wenn ich es richtig verstanden habe. D.h. es gibt eine Config Datei die das mapping der Typen der Klassen und deren Properties beschreibt, das stelle ich mir dann ungefähr so vor in der Config:
    SourceClassType=KlasseA, SourcePropertyName=PropA->DestinationClassType=KlasseB, DestinationPropertyName=PropX.
    Kann das so funktionieren?
    Wenn nun nach meinem Ausscheiden der Firma ein Fehler in dem Mapping erkannt wird, muss man nur die Config anpassen.
    Automapper kann dies nicht? Oder gibt es ein Framework das dies kann um den Weg nicht selber programmieren zu müssen
    Sind diese Einschätzungen korrekt?

Dann habe ich noch zwei Fragen:
a) Die aus dem Schema erzeugte Datenstruktur hat zum Teil unübersichtliche Klassen und Property Bezeichner. Kann XSD.exe oder ein anderes Tool andere Bezeichnernamen generieren? Und dann müsste natürlich wieder später wenn ich die Daten wieder serialisiere und an den Webservice zurück sende, ein zum Schema konformes XML erzeugt werden. Ist das möglich?

b) Dann gibt es noch einen Spezialfall in meinem Schema und dem Mapping auf meine eigene Datenstruktur: Aus irgendeinem Grund generiert mir XSD.exe bei den Klassen immer eine Property "Text" welche vom Typ string[] ist, so wie es aussieht steht hier immer bei index=0 das was in einem Element zwischen den Spitzen klammern steht z.b. <ElementXYZ>abc</ElementXYZ>. Ok während ich das hier schreibe, erkenne ich gerade, dass dieser Text ja irgendwo gespeichert werden muss und da das Element ein komplexer Typ ist, legt XSD.exe dies wohl automtisch an. Aber warum als string array? Hier gibt es doch dann ein Problem, wenn ich genau diesen Wert aus index=0 Mappen möchte auf eine Property in meiner eigenen Datenstruktur. Geht das überhaupt mit Automapper, dass man aus Listen einen Wert mappen kann?

So das war jetz ne Menge Holz ich weis, aber ich hoffe ihr könnt mir trotzdem weiterhelfen auf die richtige Bahn zu kommen. Und ich finde dies ein interessantes Thema und würde gerne darüber mit euch diskutieren. Danke!

15.11.2011 - 00:45 Uhr

Ich habe ein ähnliches Problem, welches ich seit Tagen versuche zu lösen, aber ich bin wohl nicht im Stande die Informationen so zusammenzusetzen, dass ich wüsste wie dies zu implementieren ist.

Bei mir ist es ein Webservice den ich ansprechen muss. Habe ein File in dem oben private RSA key steht und darunte certificate.

Könnt ihr mir bitte erklären und wenn möglich Code-Beispiele, wie ich mit Bouncycastle (wie bisher recherchiert geht dies wohl nicht so einfach mit .net Klassen, ich glaube die Files hier sind im PEM format) das zu implementieren ist?

Mein Zertifikat wollte ich so erstellen:
X509Certificate2 cert = new X509Certificate2( "file" );

Passwort habe ich keins. Wie gesagt file enthält private key und certificate. Ist das überhaupt ausreichend um eine two-way ssl authentifizierung zu implementieren?

Mein Code sieht dann in verkürzter Form so aus:


X509Certificate2 cert = new X509Certificate2( @"C:\file.txt" );
QcsiWebService.WSAdapterBCIClient webService = new QcsiWebService.WSAdapterBCIClient("WSAdapterBFPortHttps");
webService.ChannelFactory.Credentials.ClientCertificate.Certificate = cert;
string response = webService.helloWorld();            

Bei Aufruf von webService.helloWorld(), kommt es dann zu einer Exception die besagt dass kein SSL Kanal und keine sichere Verbindung aufgebaut werden konnte. Hab die Ex Meldung gerade nicht hier. Kann ich wenn ich wieder im Büro bin noch nachreichen.

Die Property cert.PrivateKey ist aber null nachdem instanziieren von cert. "File.txt" ist funktionstüchtig da dieses mit SoapUI oder in Java Keystore erfolgreich eingebunden werden kann und Aufrufe an den Webservice erfolgreich sind. Weis nicht ob es ausreicht mit bouncycastle den PrivateKey zu setzen!?

Das setzen des Zertifikats wird vermutlich auch anders gemacht als ich es hier mache, aber das ist auch nicht das Problem.

Bräuchte bitte Hilfe wie hier die Aufrufe (mit bouncycastle api)zu machen sind.
Hoffe ihr könnt mir weiterhelfen, schon mal vielen Dank vorab!

11.11.2011 - 15:11 Uhr

mittlerweile scheint mir die ursache klar zu sein, weis aber nicht wie ich es beheben kann.

ich habe zwei dateien, ein *.crt file das beinhaltet keinen private key, und ein file das beinhaltet das zertifikat und den key, die dateiendung dieses files ist *.txt. beim test mit soapUI wird dieses txt file angegeben und der webservice aufruf funktioniert.

in .net muss man das file ja in den windows zertifikatsspeicher imortieren und dann im app.config meines webservice client angeben. bisher habe ich das *.crt file im windows zertifikatsspeicher abgelegt, ist aber nutzlus für die authentifizierung beim webservice, da dieser das file mit dem zertifikat inkl private key, also das txt file benötigt.

Problem: das txt file läßt sich nicht im windows zertifikatsspeicher installieren. es kommt die Fehlermeldung "Der Dateityp ist nicht erkennbar.". Vermutlich weil es ein txt file ist. Wenn ich die dateiendung umbenne in p12 oder pfx ändert das leider auch nichts.

ich habe leider keinen einfluss auf die erstellung der zertifikatsdaeiten und muss mit denen klar kommen die mir gegebern sind.

könnt ihr mir sagen wie ich txt file in ein korrektes format bekomme?
andere idee wäre noch ein custombindung zu implementieren, so dass nicht das zertifkiat aus windows zertifikatsspeicher genommen wird, sondern von einem speziellen Festplattenort?

10.11.2011 - 18:48 Uhr

Danke für die Info!
Mittlerweile habe ich das auch rausgefunden, wenn man die WSDL als Servicer Referenz hinzufügt legt VS automatisch die app.config an, in der man dann die ganzen Bindings etc sieht die es auch be WCF gibt 😃

In der app.config konnte ich jetz auch das Zertifikat angeben und wo es zu finden ist. Das funktionioert, aber sobald ich einen Aufruf an den Webservice mache kommt es zur Excpetion: Die Anfrage wurde abgebrochen: Es konnte kein geschützter SSL/TLS-Kanal erstellt werden.

Der Vorschlag der überall im Inet zu finden ist, den ServerCertificateValidationCallback zu implementieren und return true zu machen funkioniert nicht, der callback wird bei mir nie aufgerufen.

Kann mir jemand bitte sagen was falsch läuft?

10.11.2011 - 14:22 Uhr

update: Problem 2 habe ich mittlerweile nach weiterem einlesen in webservices und soap verstanden und weis nun wie ich die klassen aus der wsdl verwenden kann. ich muss die klasse instanziieren die den service representiert, dort werden dann alle methoden angeobten, code habe ich wie folgt geändert.


ServicePointManager.Expect100Continue = ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
ServicePointManager.ServerCertificateValidationCallback =
                ((sender, certificate, chain, sslPolicyErrors) => true);

QcsiWebService.WSAdapterBCIClient webService = new QcsiWebService.WSAdapterBCIClient();
string response = webService.helloWorld();
Console.WriteLine(string.Format("Result of hello world requuest: {0}", response));

Mit diesem Code kommt es nicht mehr zur gleichen Exception wie bei Problem 1 beschrieben, dafür kommt es zu einer ähnlichen Exception:

System.ServiceModel.Security.SecurityNegotiationException: Es konnte kein sicherer Kanal für SSL/TLS mit Autorität "xyz.com" eingerichtet werden. ---> System.Net.WebException: Die Anfrage wurde abgebrochen: Es konnte kein geschützter SSL/TLS-Kanal erstellt werden.

Ich habe ein srt zertifikat, dass wird u.a. auf der serverseite dafür benötigt, um einen gewissen datenbestand für den webservice freizuschalten (jeder kunde erhält also ein anderes zertifikat).
Aber wie ich dieses Zertifikat in dem oben dargestellten Code einbauen kann habe ich nicht herausgefunden.

Mit diesem Code hier kann man ein Zertifikat angeben:


((HttpWebRequest)httpWebRequest).ClientCertificates.Add(mVerifyCert);

Aber eigtl brauche ich doch keine expliziten http requests mehr, da ich ja meine service instanz siehe code oben habe.

10.11.2011 - 00:29 Uhr

Danke für deine Antwort!
Das mit der Xml Struktur im CDATA meine ich gelesen zu haben, dass das nicht unüblich ist!? Gibts noch andere Meinungen dazu?

Also mit WCF hat das ganze wohl gar nichts zu tun, weil der service wohl ein (java) soap ist. woran auch immer man das erkennt?

09.11.2011 - 18:26 Uhr

Ich komme einfach nicht klar und benötige Eure Hilfe 😦

Habe zwei Probleme, aber kurz zur Ausgangssituation:
Ich habe eine Konsolenapplikation erstellt. Habe eine WSDL als Datei vorliegen und mit Add Service Reference eingebunden.

Problem 1: https Verbindung aufbauen:
Das scheitert beim Aufruf von


WebResponse webResponse = httpWebRequest.GetResponse();  

mit der Execption: System.Net.WebException: Die Anfrage wurde abgebrochen: Es konnte kein geschützter SSL/TLS-Kanal erstellt werden.

laut Google sollte folgender Code Abhilfe schaffen:


ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
ServicePointManager.ServerCertificateValidationCallback = delegate(Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return (true); };

aber leider springt er nicht mal in den delegate handler (habe diese inline zeile mit dem delegate auch schon als methode ausprogrammiert und haltepunkt gesetzt,aber da springt er nicht rein, d.h. es kommt nich mal zur Zertifikat Überprüfung)

Problem 2: wie ruft man dann die methoden des Webservices auf? Dazu kann ich die Klassen der WSDL als Objekte anlegen, aber wie kommt es nun zum Aufruf des Service? Bin aus google nicht schlau geworden wie die aus der WSDL erstellten Typen verwenden kann? Muss man die irgendwie in ein Xml Dokument packen und dann einen neuen httpwebrequest verpacken?
Ein Code Beispiel was ich meine:


QcsiWsdl.helloWorldRequest helloWorldRequest = new helloWorldRequest();
QcsiWsdl.helloWorldResponse helloWorlResponse = new helloWorldResponse();

Methoden gibt es keine auf den beiden Objekten. Ich verstehs nicht was mir die Objekte bringen.
Mit dem Tool SoapUI, sieht man den XmlRequest umhüllt in Envelops und dazu als Antwort gültiges XmlResponse mit helloworld Inhalt umhüllt in Envelopes Elementen.

Als Zusatzinfos es handelt sich um einen Java Webservice auf den ich keinen Einfluss habe.
Des Weiteren der Webservice hat zwei Adressen, eine ungesicherte http Adresse, über die ich mir die WSDL holen konnte,als Datei abgespeichert und als Service Referenz hinzugefügt. Die zweite Adresse ist eine gesicherte https Adresse, diese scheint wohl nur für die WebService Kommunikation da zu sein (und späteren Produktivbetrieb), hier erhält man nicht die wsdl wenn man die adresse im browser eingibt. Oder müsste man diese im Browser sehen wenn man das Zertifikat installiert?

Hier noch mein kompletter Code den ich zum Verbindungsaufbau verwende:


ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
            ServicePointManager.ServerCertificateValidationCallback = delegate(Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return (true); };
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(Settings.Default.WebServiceUrl);
            mVerifyCert = new X509Certificate2(Settings.Default.CertificateFileNameFull);
            httpWebRequest.ClientCertificates.Add(mVerifyCert);
            WebResponse webResponse = httpWebRequest.GetResponse();

Und hier das Request Dokument für hello world was mir soapUI anzeigt


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bci="http://xyz.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <bci:helloWorld/>
   </soapenv:Body>
</soapenv:Envelope>

und der response dazu:


<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:helloWorldResponse xmlns:ns2="http://xyz.com/">
         <return>Hello World</return>
      </ns2:helloWorldResponse>
   </S:Body>
</S:Envelope>

08.11.2011 - 13:36 Uhr

kleines update: die klassen konnte ich mit xsd.exe erstellen 😃 (trotzdem gibt es noch andere wege wie man dies realisieren kann?)
ansonsten stehen die anderen fragen noch offen...

08.11.2011 - 12:53 Uhr

Hallo zusammen, hoffe ihr könnt mir etwas Licht ins Dunkel bringen.

Ich muss auf einen Java Web Service (jaxws) per C# und .net 4.0 zugreifen, in einem der Aufrufe erhalte ich im Response ein ![CDATA[.....]]. Der content des CDATA ist ein XML, wie der Java Web Service dieses erstellt hat, kann ich nicht sagen(ist die Info wichtig?), muss auch noch erwähnen dass ich von Java keine Ahnung habe, sollte aber auch nicht notwendig sein. Das Schema zum XML habe ich.

Kann ich nun mit .net Serializern (welcher wäre zu empfehlen, auf was ist zu achten) oder anderen Tools (xsd.exe hab ich gelesen, ist das heutzutage die vorgehensweise?) die C# Klassenstruktur automatisch erstellen?
Wie funktioniert das genau? Muss wohl irgendwie mit dem XSD funktionieren oder gibt es da andere Wege?
Gibt es Kompatibilitätsprobleme?
Danach sollte es möglich sein gegen diese Typen impelementieren zu können!?
Und wie erstellt man zur Laufzeit die Objekte?

Und andersherum muss ich auch wiederum diese Objekte wieder als XML serialisieren und in das CDATA stecken.
Wie funktioniert das?

Hab noch nicht viel, mit Web Services gemacht. Die WSDL des Web Services muss ich doch einfach nur als Service Reference hinzufügen um Zugriff auf die Services des WS zugreifen zu können!? Muss man ein spezielles Projekttemplate verwenden?
Gibt es hier Komptibilitätsprobleme zwischen Java und .net.

Vielen Dank!

06.01.2010 - 11:41 Uhr

ah stimmt, habs endlich kapiert!

Vielen Dank!

06.01.2010 - 00:54 Uhr

Danke für die schnellen Antworten.
So ganz sicher bin ich mir aber noch nicht. Ich versuch das von mir erst genannte Beispiel mit Herbivore´s Beschreibung:

  1. Maske: 0100 0000

  2. Bit 6 laus Bitfeld1 öschen:

  1011 1111
& 0001 0101
-----------
= 0001 0101
  1. Mit Maske Bits aus Bitfeld2 löschen:
  1011 1111
& 0100 0000
-----------
= 0000 0000
  1. Zwischenergebnisse verodern:
  0001 0101
| 0000 0000
-----------
= 0001 0101

War das so korrekt?

05.01.2010 - 18:43 Uhr

Hi,

ich komm einfach nicht drauf.
Bsp:
Bitfeld1: 0001 0101
Bitfeld2: 0100 0000

Ziel: Bit6 aus Bitfeld1 mit Bit6 aus Bitfeld2 setzen = 01010101.

Bit6 aus Bitfeld1 soll in jedem Fall ersetzt werden, d.h. auch wenn z.B.
Bitfeld1=0101 0101 und
Bitfeld2=0000 0000
= 0001 0101

Mit welcher Bitoperation gelingt das für beide Beispiele? Mit AND, OR, XOR komme ich nicht auf die Lösung. Und wie sieht dann der Code in C# dazu aus?

Hoffe Ihr könnt mir helfen...

Danke!

07.05.2009 - 23:38 Uhr

da noch niemand geantwortet hat, heisst das es geht definitiv nicht oder weis es nur niemand?

02.05.2009 - 13:01 Uhr

hallo,

per google und hier im forum habe ich nichts zu folgender Frage gefunden.
ist es möglich Konstanten die man in einer "GlobalConstant" - Klasse definiert hat, im Visual Studio Designer, also zum Setzen von Properties von Controls verwenden kann? Bsp: Man definiert Spaltennamen einer Tabelle in einer Const-Klasse und verwendet diese dann, wenn man mit dem Designer einen DataTable mit entpsrechenden Spalten erzeugen möchte, zur Benennung der Spaltennamen.

danke!

30.11.2008 - 13:49 Uhr

@kleines_eichhoernchen: bezieht sich der Auto_Increment auf alle innerhalb meiner Anwendung (also meines Prozesses) erzeugten Objekte oder gilt dieser für alle Objekte aller Prozesse die auf dem Betriebssystem Instanziiert sind?
Ich vermute Prozessbezogen, weil ich in meiner Anwendung z.B. Objekte untersucht habe die die Id 9975 haben, heisst das also dass dieses Objekt dann das 9975ste erzeugte Objekt meiner Anwendung ist? Das bedeutet doch dann widerum, dass ich noch bis zu der von herbivore angesprochen 4 Mrd Grenze noch gut luft habe.

Die Id bleibt auch garanetiert für die lebensdauer dieses Objektes oder kann diese durch irgendwelche Umstände im Laufe des Programms sich ändern?

Für diese Id könnte man sich doch ein Plugin für VS bauen, dass diese Id eines Objekts immer in einer Spalte des Überwachen-Fensters darstellt!?

18.11.2008 - 12:56 Uhr

danke an herbivore für die erklärung. da du keine sonstigen alternativen erwähnt hast, gehe ich mal davon aus, dass du auch keine kennst!?

14.11.2008 - 15:51 Uhr

Hallo,

habe jetz schon ne weile im Netz und verschiedenen Foren recherchiert. Zunächst zu meiner Frage. Ich möchte während dem Debuggen mit Visual Studio 2005 (meine Projekte werden jedoch mit .Net 1.1 übersetzt) im Debugger sehen mit welchem Objekt ich es konkret zu tun habe. Sprich ich möchte zwei Instanzen einer Klasse im Debugger identfizieren können. Allerdings möchte ich hierfür keine Klassenvariablen als ID, oder GetHashCode oder ähnliches einsetzen.

Ich hab im Netz Beschreibungen gesehen dass dies mit VS2005 unc C# Projekten geht in dem man Rechtsklick auf die Variable im Überwachungsfenster macht und auf Objekt-Id erstellen klickt. Dies funktioniert aber anscheinend erst ab .Net2.0. Ich übersetze meine C#-Projekte aber mit .net 1.1 und dort funktioniert dies nicht.

Gibt es vielleicht ein Plugin für VS das dem Debugger diese Information hinzufügt? Oder habt ihr noch andere Vorschläge?

Danke!

18.09.2008 - 13:38 Uhr

Ja das ist klar. Nur wenn man F5 drückt Debuggen Starten, dann wird doch alles übersetzt, egal ob geändert oder nicht. In 2008 scheint dies nicht der Fall zu ein.

18.09.2008 - 08:55 Uhr

Danke für deine Hilfe!

Ehrlich gesagt weis ich nicht genau was du mit Compileoutput erhöhen meinst?
Aber daran kann es eigentlich auch nicht liegen, da bei meinen Kollegen genau dasselbe Problem auftritt. Und es ist ein deutlicher zeitlicher Unterschied wenn man die Dauer des Übersetzungsvorgangs von VS2005 mit dem in VS2008 vergleicht, wenn man nur eine Änderung an einem Projekt von ingesamt zwölf Projekten durchführt.

Kann es sein dass hier dass Stichwort "Incremental Build" eine Rolle spielt? Oder geht das in ne andere Richtung?

17.09.2008 - 11:19 Uhr

Hat denn niemand einen Tipp? Oder geht es in VS2005 einfach nicht?

15.09.2008 - 08:46 Uhr

Hallo,

zu meiner Frage bin ich hier im Forum und im Netz nicht fündig geworden, vielleicht könnt Ihr mir diese beantworten.

Ausgangssituation: Man hat eine Projektmappe mit mehreren Projekten, die bei Klick auf Ausführen entsprechend ihrer Projektabhängigkeiten der Reihe nach übersetzt werden.

In VS2008 ist es so, dass nur Projekte übersetzt werden, die man auch geändert hat.

In VS2005 jedoch, werden grundsätzlich alle Projekte übersetzt. Dies kann ziemlich langwierig sein, wenn man viele Projekte übersetzt werden müssen, an denen jedoch kein Code geändert wurde.

Kann man dies irgenwie für VS2005 so hinbekommen wie in VS2008, dass beim Ausführen nur die Projekte übersetzt werden, an denen man Code-Änderungen vorgenommen hat?

Vielleicht muss ich noch erwähnen, dass ich die Projekte zwar mit VS2005 entwickle,aber per MSBee mit .net 1.1 übersetze. Aber in VS2008 klappt dies wie gesagt auch. Nur kommt dies in nächster Zeit bei uns noch nicht in Einsatz.

Vielen Dank!

07.11.2007 - 21:24 Uhr

danke für die raschen antworten. also das wurde bisher so von meinen kollegen implementiert. müsst ich mal ein kleines redesign überdenken.

habs jetz vorerst mal anders gelöst. ich entferne den rahmen der form mit borderstyle.none und mit ShowInTaskbar = false. werde aber auch nochmal den windows.forms.timer testen, hab ich noch nicht dran gedacht. unter den windowsMessages kann ich mir nichts genaus vorstellen, müsst ich mich mal einlesen.

07.11.2007 - 09:33 Uhr

Hallo,

habe folgendes Problem. Ich habe eine Applikation, die bei einer bestimmten Benutzeraktion eine neue modale Form öffnet, die eine bestimmte Wartezeit geöffnet ist. um so Benutzereingaben für die Hauptapplikation zu unterbinden. Das funktioniert auch alles soweit. Die modale Form, ich nenn sie jetz mal Waitform besitzt zwei Timer. Ein Timer sorgt dafür die Waitform 60 Sekunden lang anzuzeigen und der zweite Timer stellt die bisher verstrichene Zeit, die bis jetzt gewartet wurde, d.h. z.b. 22s von 60s dar und wird natürlich jede Sekunde aktualisiert. Das funktioniert soweit alles einwandfrei.

Nun zum eigentlichen Problem, wenn ich nun während die Waitform geöffnet ist, einen rechtsklick auf deren Fenster in der Taskleiste mache oder einen Rechtsklick auf die Titelleiste der Waitform und das Kontextmenü so lang geöffnet lasse bis die 60 Sekunden abgelaufen sind, schließt sich die Waitform nicht, sondern zählt über die 60 Sekunden hinaus, d.h. es wird dann z.b. 65s von 60s angezeigt und zählt so lange weiter bis ich einen Klick mit der Maus auf irgendeine Fläche des Bildschirms mache.

Für das offen halten der verwende ich den System.Timers.Timer (habe aber auch schon den Threading.Timer verwendet ohne Erfolg), für die Sekundenanzeige verwende ich auch einen System.Tiimers.Timer(ebenfalls den Threading.Timer ausprobiert ohne erfolg).

Was ich ausschließen kann ist, dass es nicht am Focus liegt, die Waitform verliert zwar den Focus beim Rechtslick auf deren Fenster in der Taskleiste, aber bei einem Rechtsklick auf die Titelleiste der Waitform behält sie den Focus. Wie beschrieben tritt in beiden Fällen das Problem auf.

Vielen Dank schon mal.

22.06.2007 - 09:29 Uhr

hallo nochmal, ist schon eine weile her, aber will hier nochmal meine letzten erfahrungen kundtun.

das mit dem grundsatz der objektorientierung kann ich nachvollziehen, jedoch sollte diese funktion diesen grundsatz nicht berücksichtigen. was sie meinen erfahrungen zur folge auch nicht tut.

ich habe festgestellt, dass visual studio sehr wohl auch in abgeleiteten Klassen nach vererbten membern sucht. jedoch ist dies sehr sporadisch und nicht nachvollziehbar wann VS dies macht und wann nicht.

manchmal ist es so, dass dies funktioniert und beim nächsten verusch alle verweise zu finden, kommt gar kein ergebnis. ich bin nicht schlau daraus geworden warum und wieso das so ist.

habt ihr ähnliche erfahrungen machen können? bzw. gibt es vielleicht ein plug-in für vs dass dies besser löst? oder wie handhabt ihr das?

der umweg über den compiler und feld umbennen geht natürlich auch, aber ist unkomfortabel und bei unseren großen projekten auch sehr zeitaufwendig.

09.05.2007 - 11:07 Uhr

Hallo,

ich habe eine Frage an die User von VS (2005).

Ich meine folgendes festgestellt zu haben.

wenn ich in einer Basisklasse ein protected Feld deklariere und dieses in abgeleiteten Klassen verwende und nun die Funktion "Alle Verweise suchen" (find all references) ausführe, kommen im Ergebnis der Suche nur die Verweise die innerhalb der Basisklasse vorhanden sind, aber nicht die die in den abgeleiteten Klassen.

Gibt es eine Einstellung die mir auch die Verweise in abgeleiteten Klassen anzeigt? Klar geht das mit dem normalen Suchen, wäre aber schöner wenns mit der alle verweise suchen funktion ginge.

auf jeden fall ist es wichtig zu wissen, dass diese funktion sich so verhält und nicht alle verweise.

Also wäre super wenn mir jemand diese Beobachtung bestätigen könnte bzw. eine Lösung dafür hätte.

mfg

06.12.2006 - 13:38 Uhr

also gleich n komplett neue reporting lösung zu kaufen nur um einen ausdruck auf ne seitgröße anzupassen kann glaub auch nicht sonderlich wirtschaftlich sein.

naja, aber trotzdem tut er nicht wie ich will. ich find den fehler net. ich muss des bis nächste woche hinbekommen, da is abgabe meiner diplomarbeit. also ich wäre für jeden tipp dankbar. hat ja mit programmierhans seiner lösung schon ganz gut geklappt bis hier her.

06.12.2006 - 08:02 Uhr

ich komm net weiter, langsam wirds frustrieren.
hat denn niemand n tipp?

05.12.2006 - 10:47 Uhr

falls es jemanden interessiert:

hab jetz zwei lösungen gefunden:

  1. In die Eigenschaften der Klasse gehen und dort unter Attribute bzw. Operationen alle Einträge einzeln löschen oder

  2. Rechtsklick-> Optionen für Shape-Anzeige und dort bei Unterdrücken die entsprechenden Haken setzen.

04.12.2006 - 10:11 Uhr

also irgendwie bekomm ich das nicht hin, dass er mir mein bild neu zeichnet.
er zeichnet nur das hardopy des controls in seiner ursprünglichen größe.
was mir beim debuggen aufgefallen ist, dass er trotz der division durch den factor, die höhe und breite des bildes nicht neu berechnet.
habe die printcontrol klasse auf meine bedürfnisse angepasst und poste sie mal hier vielleicht sieht ja jemand was ich da falsch mache.


public class ChartPrinting
	{
		public PrintDocument printDocument;
		private Image targetImage;
		private Image sourceImage;

		private int iControlWidth;
		private int iControlHeight;

		private float factor;

		public ChartPrinting()
		{
			this.printDocument = new PrintDocument();
			this.printDocument.DocumentName = "Einzelwertstatistik";			
		}

		[DllImport("gdi32.dll")]
		private static extern long BitBlt(
			IntPtr hdcDest,
			int xDest,
			int yDest,
			int nWidth,
			int nHeight,
			IntPtr hdcSource,
			int xSrc,
			int ySrc,
			Int32 dwRop);

		const int SRCCOPY=13369376;
		

		/// <summary>
		/// Prints a Control (or Form).
		/// </summary>
		/// <param name="pCtrl"></param>
		/// <param name="pageSettings"></param>
		public void PrintControl(Control pCtrl, PageSettings pageSettings)
		{
			this.PrintControl(pCtrl, pageSettings, null);
		}
		/// <summary>
		/// Prints a Control (or Form) to a specific printer
		/// </summary>
		/// <param name="pCtrl">Control (or Form) to print</param>
		/// <param name="pPrinterName">Name of the printer (e.g.: from System.Drawing.Printing.PrinterSettings.InstalledPrinters)</param>
		public void PrintControl(Control pCtrl, PageSettings pageSettings, string pPrinterName)
		{
			//
			// lock against other threads, due to changing a variable on class level 
			//
			lock(this)
			{
				//
				// Change printer, if a printer name was passed for this print documnet
				//
				if (pPrinterName != null && pPrinterName != string.Empty)
				{
					this.printDocument.PrinterSettings.PrinterName = pPrinterName;
				}
				//
				// Append PrintPageEventHandler
				//
				this.printDocument.PrintPage += new PrintPageEventHandler(this.printDocument_PrintPage);
				//
				// Create source objects for copy process
				//
				Graphics gSource = Graphics.FromHwnd(pCtrl.Handle);
				Rectangle rectSource = pCtrl.ClientRectangle;
				this.sourceImage = new Bitmap(rectSource.Width, rectSource.Height, gSource);
				//rectSource.Size = pageSettings.PaperSize;
				//
				// Calculate print area
				//
				iControlWidth = pageSettings.PaperSize.Width - (pageSettings.Margins.Right + pageSettings.Margins.Left);
				iControlHeight = pageSettings.PaperSize.Height - (pageSettings.Margins.Bottom + pageSettings.Margins.Top);
				//
				// Create target objects with size of the print area
				//
				this.targetImage = new Bitmap(this.iControlWidth, this.iControlHeight);
				Graphics gTarget = Graphics.FromImage(this.targetImage);
				gTarget.FillRectangle(new SolidBrush(Color.White), 0, 0, this.targetImage.Width, this.targetImage.Height);
				//
				// Calculate resize factor
				//
				this.factor = Math.Max((float)this.sourceImage.Width / (float)this.iControlWidth, (float)this.sourceImage.Height / (float)this.iControlHeight);
				//
				// Draw resized Image
				//
				gTarget.DrawImage(this.sourceImage, 0, 0, (float)this.sourceImage.Width / this.factor, (float)this.sourceImage.Height / this.factor);
			
//				_ImageToPrint = this.ResizeBitmap(tempBitmap, iControlWidth, iControlHeight);
				//
				// Create source for HDC (Handle Device Context)
				//
				IntPtr hdcSource = gSource.GetHdc();
				//
				// Create destination objects for copy process
        //        
//				Graphics gTarget = Graphics.FromImage(_ImageToPrint);
				//gTarget = Graphics.FromImage(this.sourceImage);
				IntPtr hdcTarget = gTarget.GetHdc();
				//
				// Copy per BitBlt(Bit Block Transfer) the image of hdcSource to hdcTarget
				//
				BitBlt(hdcTarget, pageSettings.Margins.Left, pageSettings.Margins.Top, this.targetImage.Width, this.targetImage.Height, hdcSource, 0, 0, SRCCOPY);
				//BitBlt(hdcTarget, pageSettings.Margins.Left, pageSettings.Margins.Top, iControlWidth, iControlHeight, hdcSource, 0, 0, SRCCOPY);				
				//
				// Release used objects
				//
				gSource.ReleaseHdc(hdcSource);
				gTarget.ReleaseHdc(hdcTarget);
				//
				// Execute print synchronously
				//
				this.printDocument.Print();
				//
				// Print accomplished, release PrintPage
				//
				this.printDocument.PrintPage -= new PrintPageEventHandler(this.printDocument_PrintPage);
				this.targetImage = null;
				this.sourceImage = null;
			}
		}

		/// <summary>
		/// Will be executed for every page to print
		/// </summary>
		/// <param name="sender">The sender</param>
		/// <param name="e">PrintPageEventArgs, in which the image has to be painted</param>
		private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
		{			
			e.Graphics.DrawImage(this.targetImage, 0, 0);
		}
	}

noch eine frage zu meiner BitBlt funktion. ist es überhaupt richtig für den 2. und 3. paramter den linken und oberen seitenrad meines blattes anzugeben?

hab grad nochmal nachgeschaut, bezüglich der BitBlt und der seitenränder. 2. und 3. parameter muss auf 0 belassen werden.
dafür in e.Graphics.DrawImage(this.targetImage, 0, 0) der printDocument_PrintPage methode abändern in e.Graphics.DrawImage(this.targetImage, e.PageSettings.Margins.Left, e.PageSettings.Margins.Top).
korrigiert mich wenn des falsch is. der ausdruck scheint zumindest zu stimmen.

aber des eigentliche problem mit dem resize is leider noch net gelöst.

04.12.2006 - 08:36 Uhr

also des hab ich ziemlich schnell gemerkt dass des visio zumindest kommts mir sovor mit einer der schlechtest ms produkte von der bienung her ist im vergleich zu z.b. zu den anderen office lösungen mit denen ich bisher zu tun hatte.

upgrade kommt leider net in frage, privat ja, aber hier in der arbeit steht des in nächster zeit auf jeden fall net an. muss es halt für meine diplomarbeit einsetzen.

03.12.2006 - 23:00 Uhr

also so wie ich des jetz verstanden hab, sind layer was anderes und hab auch glaub keine definiert.
aber des problem an sich hab ich noch nicht gelöst...

03.12.2006 - 21:42 Uhr

hallo,

bräucht bitte eure hilfe.
hab visio 2003 und vs. net 2003.

hab mit reverse engineering meine klassen nach visio gebracht.
funktioniert ja problemlos.
jetz will ich mir ein vereinfachtes klassendiagramm erstellen. wenn ich nun die klasse auf die zeichlfäche ablege, würde ich gern einfach nur den klassennamen haben wollen und die attribute und methoden entfernen.
beim versuch das zu löschen meckert visio immer, "der befehl kann nicht vollständig ausgeführt werden,da das shape oder der layer geschützt sind". hab versucht den schutz des ganze shape über format schutz aufzuheben,ich kann zwar die haken rausnehmen und die bleiben auch draueßen,aber bringt trotzdem nix. und für die einzelenen bereiche des shapes,also attribute und methoden bereiche (sind das eigtl die layer?), hab ich versucht den schutz auzheben, aber geht au net.

kann ich des irgendwie hinbekommen? die visio hilfe ist da keine große hilfe 🙁

danke schon ma im voraus.

02.12.2006 - 23:37 Uhr

he super, vielen dank, hat prima funktioniert!!

02.12.2006 - 19:13 Uhr

hallo, bräucht mal bitte eure hilfe.

ich benutze vs. net 2003. bin auch noch nicht so erfahrener benutzer von VS.

ich hab ne projektmappe erstellt die zwei Projekte (zwei projektordner) beinhaltet. jetzt würde ich gern eines der beiden umbennen. also im projektexplorer geht des ja ganz einfach mit umbennen. nur der dazugehörige ordner auf der platte lässt sich nicht ändern. gibts da ne möglichkeit den Projektordner igrendwie zu ändern? hab da keine gefunden.

vielen dank im voraus!

01.12.2006 - 15:36 Uhr

vielen dank für die schnelle antwort und super hilfsbereitschaft. also ich denk ich müssts kapiert haben und versuch des mal gscheit in die printcontrol methode zu implementieren.

01.12.2006 - 14:32 Uhr

vielen dank für die hilfe.

versuch jetzt schon den ganzen vormittag zu verstehen was da in der GetThumbnail Methode passiert, bin dann anscheinend doch noch zu sehr anfänger.
ich poste mal hjer die methode und versuch die mal zu erklären, hoff du/ihr kannst mich dann korrigieren wenn ich was falsch verstanden habe:


private Image GetThumbnail(Image pImage, Rectangle pBounds)
        {
            Image ret=new Bitmap(pBounds.Width,pBounds.Height);
            Graphics g=Graphics.FromImage(ret);
            g.FillRectangle(new SolidBrush(Color.White),0,0,ret.Width,ret.Height);
            
            float factor=Math.Max((float)pImage.Width/(float)pBounds.Width,(float)pImage.Height/(float)pBounds.Height);
            g.DrawImage(pImage,0,0,(float)pImage.Width/factor,(float)pImage.Height/factor);
            g.Dispose();
            
            return ret;
        }

  1. zunächst übergebe ich mit pImage mein bild (also das image meines controls),dass ich quasi resizen möchte!?

  2. zu übergabeparameter pBounds: das müsste mein DIN A4 blatt abzüglich der seitenränder, also die zu druckende fläche sein!??

  3. dann erzeuget man eine neue Bitmap mit den abmessungen des zu druckenden Bereichs.

  4. danach wird eine neue zeichenfläche mit den abmessungen der bitmap erstellt!?

  5. das rechteck dieser zeichenfläche wird mit weisser farbe gefüllt und mit den abmessungen der bitmap!?

  6. der factor wird benötigt um mein bild pImage auf die größe des zu druckenden bereichs zu resizen!??

  7. das resizen macht dann letztendlich die drawimage methode!??

  8. dann wird er speicher für g bereinigt.

  9. return ret; versteh ich nicht wirklich. ich will doch eigtl jetzt mein neues pImage zurückgeben. mit ret passiert doch die ganze zeit gar nichts außer in den ersten zwei zeilen. was bezweckt man damit ret zurückzugeben??

sorry für diese komischen fragen, aber nur mit der doku bin ich jetz net weitergekommen.

28.11.2006 - 11:59 Uhr

also hab des jetzt mal mit folgender methode probiert:


private Bitmap ResizeBitmap(Bitmap b, int nWidth, int nHeight)
{  
   Bitmap result = new Bitmap(nWidth, nHeight);  
   using(Graphics g = Graphics.FromImage((Image) result)) 
   g.DrawImage(b, 0, 0, nWidth, nHeight);
   return result;
}

aber so funktioniert des irgendwie net. muss ich da noch was anderes im code ändern. also irgendwann nach meinem methodenaufruf? oder is des schon der völlig falsche weg was ich da vor hab?

den parameter b hab ich mit _ImageToPrint übergeben und die andern beiden parameter hardcodiert. da muss ich mir noch überlegen wie ich meine papiergröße bzw papiergröße minus ränder übergebe. müsste eigtl irgendwie über mein PageSetupDialog gehen !?

28.11.2006 - 07:50 Uhr

he norman, danke dir! naja das problem is net den wald nicht zu sehen sondern sich im wald zurechtzufinden, wenn man erst seit einigen wochen mit c# zu tun hat. und des druckthema is dann für so n fortgeschrittenen anfänger wie mich 😉 net so einfach. kann mir unter deinem vorschlag noch nix genaues vorstelle aber ich werd jetz ma versuchen was zu deinem vorschlag zu finden und einzulesen. evtl meld ich mich nochmal.

27.11.2006 - 15:40 Uhr

ist meine Frage zu trivial oder hat sie einfach noch keiner gelesen?
bräucht bitte eure hilfe.

was ich jetzt noch festgestellt habe ist wenn ich das control bzw. die form maximiert ist dann ist die auflösung zu groß und das control wird dann natürlich auf dem papier abgeschnitten. also wäre es notwendig, dass sich die druckgröße kontrollieren kann, standardmäßig würde es reichen wenn es automatisch an die papiergröße angepasst wird. ist das zu realisieren? könnt ihr mir bitte sagen wie ich das hinbekomme?
vielen dank!!

19.11.2006 - 19:50 Uhr

hallo,

erstmal n riesen dankeschön für diesen code (und erklärungen dazu), habs auch ohne probleme zum laufen gebracht. aber ich hab da jetz noch zwei problemchen bzw. anpassungen die ich gerne verwenden würde.

und zwar wie bekommt man es hin, ein control das größer ist als eine DIN A4 seite auf die papiergröße anzupassen so dass quasi dass control automatisch auf die gesamte seiten größe angepasst wird?(unter Berücksichtung der seitenränder,wie in meiner nächsten frage erklärt)

die andere frage ist, wie kann ich der methode (bzw. klasse) meine pagesetupdialog einstellungen übergeben? also was bis jetzt klappt, ist dass die einstellung der Orientierung (Hoch/Querformat) des pagesetupdialog für den druck mit der Methode übernimmt, jedoch nicht die seitenränder. das control setzt er immer ins linke obere eck. wie kann ich die seitenränder an die methode von programmierhans übergeben?

05.10.2006 - 10:28 Uhr

Muss ich vielleicht vorher mittels XmlDocument und XpathNavigator die Daten auslesen? Weil ich ja irgendwie zu der Tabelle navigieren muss um nur die Daten für diese Tabelle auszulesen!? Das Schema muss ich ja eigtl nicht mitauslesen, dass kann ich doch für mein DataSet selber definieren, es ist dann im Dataset nur eine Tabelle und 2 Spalten zu definieren!? Das müsst ich hinbekommen aber dass mit dem XmlDocument und XpathNavigator wird glaub ein Problem...

04.10.2006 - 15:29 Uhr

Danke für Deine Antwort!
Nur weis ich nicht genau wie du das meinst? Wie lese ich die Daten vorher aus und wohin speicher ich die, damit die dann ins DataSet übernommen werden? Wie gesagt ich hab gerade erst mit C# Programmierung und Programmierung an sich angefangen.

03.10.2006 - 20:22 Uhr

Hallo Leute,

ich habe n ziemlich komplexes XML file was selbst aus einem Dataset erstellt wurde (nicht von mir). Nun muss ich mittels Dataset nur eine bestimmte Tabelle einlesen und von dieser Tabelle brauche ich auch nicht alle Felder sondern nur zwei.
Das einlesen des ganzen Files hab ich hinbekommen ist ja nicht sonderlich schwer mit ReadXml, aber ich habe sehr wenig Programmiererfahrung und deshalb diese Frage.

Also gibt es ne Möglichkeit vor dem Einlesen in das Dataset, den Tabellennamen und die Spalten anzugeben die man einlesen möchte? Und wenn möglich auch noch die Felddefinitionen dazu?

Dank schon mal für eure Hilfe.

11.09.2006 - 19:58 Uhr

kann mir niemand helfen?

oder is des so einfach, dass ihr denkt da soll er selber draufkommen???
wenn man erfahrener programmierer is, wirds wahrsl leicht sein, aber ich hab halt so gut wie noch gar nix programmiert

09.09.2006 - 21:22 Uhr

Hallo,

ich bin C# Anfänger und bräucht bitte eure Hilfe.

Habe aus einem XML File ein DataSet erzeugt. Dieses besteht nun aus mehreren Tabellen. In einer dieser Tabellen (ich nenn sie mal T10) gibt es eine Spalte(pdate) die ein Datum darstellt, aber vom Typ String ist. Der string ist immer so aufgebaut: 2006071012304010, was bedeuten soll JahrMonatTagStundeMinuteSekundeMillisekunden. Nun würde ich gern diese Spalte im DataSet vom Typ DateTime in dem gerade beschriebenen Format haben wollen.
Bzw kann man eine neue Spalte in diesem Format mit den Werten aus der Spalte "pdate" dem DataSet hinzufügen?

Kann man das Konvertieren des Typs in einen anderen Typ innerhalb eins DataSets überhaupt hinbekommen? Kann man das als CustomDateTime machen? oder Stellen die Millisekunden da schon ein Problem dar?

Wär für jede Hilfe dankbar.

Gruß
Christian