Laden...

Forenbeiträge von confused Ingesamt 62 Beiträge

11.03.2009 - 07:51 Uhr

Hallo!

Mein Visual Studio erstellt mir immer beim Öffnen einer Solution einen leeren Ausgabeordner eine Verzeichnisstufe zu hoch. Das passiert mir allerdings nur, wenn eine xml-Dokumentations-Datei miterstellt wird, die außerhalb des Solutionsordners abgelegt werden soll.

Man kann das sehr schnell nachvollziehen:

  1. Neues Projekt erstellen (ClassLibrary)
  2. Ausgabeordner der xml-Dokumentationsdatei außerhalb des Solution-Ordners raussuchen (aber immer noch relativ zu diesem) (....\out\Datei.xml)
  3. Bauen, Schließen, Neu öffnen
  4. Sehen, dass ein leerer Ordner (......\out) eine Verzeichnisstufe höher als erwartet entstanden ist, der jedesmal beim erneuten Öffnen wieder automatisch erstellt wird, falls er nicht vorhanden ist.

Weiß jemand, warum sich VS so verhält, und wie man das abstellen kann?!

Grüße

20.02.2009 - 21:44 Uhr

Hm,

ich habe gerade nochmal den Versuch gemacht und eine Unterklasse von TextWriterTraceListener erstellt. Deren Close oder Dispose-Methode wird nicht aufgerufen. Allerdings der Destruktor.

Je länger ich suche, desto mehr habe ich das Gefühl, dass ich damit leben muss, dass nicht alles in der Logdatei landen kann, was beim Shutdown passiert...

Kann es sein, dass beim Beenden der Applikation einfach alle offenen Dateien usw. pauschal geschlossen werden, und ich quasi das "Pech" habe, dass danach meine Objekte noch aufgeräumt werden und dann keine Zugriff mehr möglich ist?

edit: KeepAlive hat übrigens auch nicht geholfen! 😦

20.02.2009 - 21:24 Uhr

Hallo,

ich habe das gleich mal mit 'GC.SuppressFinalize(myTextWriterTraceListener)' versucht (das hattest du doch gemeint, oder?), aber leider kam trotzdem die Exception, dass die Datei schon geschlossen ist.

Der Stack zur Exception sieht dazu übrigens so aus:

bei System.IO.__Error.FileNotOpen()
bei System.IO.FileStream.Write(Byte[] array, Int32 offset, Int32 count)
bei System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
bei System.IO.StreamWriter.Flush()
bei System.Diagnostics.TextWriterTraceListener.Flush()
bei System.Diagnostics.TraceInternal.WriteLine(String message)
bei System.Diagnostics.Trace.WriteLine(String message)

Mir ist irgendwie schon klar, dass es nicht so ohne ist, beim Shutdown der Anwendung noch in eine Datei zu schreiben, aber ich hoffe einfach, dass es da noch eine Lösung gibt (es handelt sich ja nicht um 100 Ausgaben sondern max. um 3-5)!

Gruß

20.02.2009 - 21:06 Uhr

Hallo,

ich habe eine Anwendung, in der ich mit einem TextWriterTraceListener Logoutput in eine Datei schreibe (Trace.Listeners.Add(new TextWriterTraceListener(...);).
Soweit funktioniert alles prima.

Meine Objekte/Klassen verwenden teilweise Destruktoren und machen dort ebenfalls Log-Ausgaben. Solange die Anwendung noch läuft, funktioniert hier auch alles prima und ich bekomme mit, wann (und vor allem wie) sich mein Objekt aufräumt.

Mein Problem beginnt nun sobald die Anwendung beendet wird:
Sobald meine Objekte mit dem GC-Finalizer-Thread weggeräumt werden, kann ich keinen Output mehr in die Logdatei machen, weil diese schon automatisch geschlossen wurde. Ein Aufruf von Trace.WriteLine(...) für an dieser Stelle zu einer Exception, weil die Datei schon geschlossen ist. Das ist natürlich sehr schade, weil auch gerade die letzten Ausgaben interessant sind.

Wie kann ich das Problem umgehen und korrektes Tracing auch im letzten Atemzug meiner Anwendung bereitstellen?! 😉

Grüße

25.01.2009 - 15:01 Uhr

Hm,

ok. Da geb ich dir Recht. Man kann nicht immer sicher sein, dass der Aufruf des BusinessLogic-Konstruktors aus dem GUI-Thread kommt. In solche einem Fall ist dann natürlich auf GUI-Seite ein Invoke notwendig.

Grüße

Kleiner Nachtrag:
Ich habe mal spaßeshalber ein bißchen getestet, wie das z.B. ein System.Windows.Forms.Timer macht: Ich habe solch einen Timer in einem neuen Thread (nicht dem GUI-Thread) erstellt, mich für das Tick-Event angemeldet und entsprechend eine Ausgabe gemacht.
Es kommt in diesem Fall darauf an, in welchem Thread man den Timer startet (timer.Start() oder timer.Enabled = true): Startet man ihn im GUI-Thread, so kommen die Tick-Events auch im GUI-Thread an, started man ihn in einem Workerthread, kommen KEINE Events an.

25.01.2009 - 11:39 Uhr

Hallo!

Für solche Sachen kann man anstatt Invoke auch z.B. den SynchronizationContext verwenden.

In deinem BusinessLogic-Konstruktor merkst du dir den "Context" des aufrufenden Threads mit


private SynchronizationContext _syncContext;
public BusinessLogic()
{
  _syncContext = SynchronizationContext.Current ?? new SynchronizationContext();
}

Dann kannst du in der Methode, die das Event feuert, dieses im richtigen Context fliegen lassen:


private void FireXXXEvent(EventArgs args)
{
  _syncContext.Send(delegate(object state)
  {
    EVENTNAME(this, state as EventArgs);
  }                
  , args);
}

Das führt dazu, dass der Delegate (und damit das Event) in dem "Context" des Threads aufgerufen wird, welcher den Konstruktor aufgerufen hat.

Grüße

15.01.2009 - 19:38 Uhr

Hallo svenson,

vielen Dank für deine Antwort.

Schade dass WCF diesen Service nicht bietet. Ich dachte immer, wenn ich auf Client-Seite durch meinen Channel mitkriege, wann der Server sich schließt, dann müsste ich doch auch auf Server-Seite mitkriegen, wenn ein Client eine Verbindung öffnet. 😦

Evtl. werde ich jetzt manuell eine Register-Methode am Server im Client aufrufen, damit dieser sich dann den CallbackChannel "merken" kann.

Grüße

14.01.2009 - 19:12 Uhr

Hallo!

Ich habe eine klassische Client/Server Anwendung programmiert. Mein Server öffnet einen WCF-ServiceHost mit einem ServiceEndpoint. Mein Client entsprechend einen WCF-Channel auf diesen Endpoint.

Jetzt möchte ich auf Server-Seite mitbekommen, wenn sich ein neuer Client verbunden hat. Gerne würde ich dabei darauf verzichten, dass der Client eine spezielle Methode am Server aufrufen muss, sondern dass der Server direkt den Channel-Open mitbekommt.

Bei einem TcpListener wäre das die klassische .Accept...()-Methode...wie kann ich das mit Hilfe von WCF umsetzen?

Grüße

05.12.2008 - 15:27 Uhr

Hm,

kann es gerade nicht im Code überprüfen, aber kann es sein, dass Probing nur in Unterordnern der Anwendung geht, nicht aber an einer beliebigen Stelle?!

Werde das mal checken...

Grüße

05.12.2008 - 08:54 Uhr

Hallo,

in meinem ClassLibrary-Projekt habe ich eine Konfigurationsdatei, die ich über ConfigurationManager.OpenMappedExeConfiguration(...) lade.

In dieser Konfigurationsdatei habe ich zudem eine CustomSection definiert. Der zugehörige Typ ist genau im selben Assembly definiert wie das, aus dem ich die Konfigurationsdatei lade.

Die ClassLibrary wird allerdings dann nicht von meinem Programm geladen, sondern von einem anderen Programm, dass irgendwo anders auf der Festplatte liegt.

Jetzt das Problem: Ich bekomme eine FileNotfoundExecption an der Stelle, an der ich dann auf meine CustomSection zugreife: xxx.GetSection(...) mit der Fehlermeldung: An error occurred creating the configuration section handler for (SectionName): Could not load file or assembly '(ClassLibrary)' or one of its dependencies.

Das Problem ist, dass er für den entsprechenden Typ der CustomSection nicht in dem Verzeichnis sucht, wo eigentlich die ClassLibrary liegt, sondern in dem Verzeichnis, wo die eigentliche Anwendung ist.

Wie kann ich dem ConfigurationManager nun sagen, wo er nach dem Typ suchen soll?!?!

Würde mich über jede Hilfe freuen!

Grüße

28.11.2008 - 14:06 Uhr

Hallo,

ich möchte für meine Unit-Tests gerne jeweils im Setup bzw. Teardown eines Tests ausgeben, welcher Test gerade gelaufen ist (für Logging-Zwecke). Gerne würde ich zuerst einfach mal den Methondenname ausgeben.

Geht es mit Reflection oder ähnlichem, die Namen der Methode die aufgerufen werden wird, bzw. wurde, herauszubekommen?!

06.11.2008 - 16:33 Uhr

Hallo,

ich habe ein Problem mit einem SetupProject in VS 2008. Und zwar ist da unter anderem eine .dll- und eine .xml-Datei drin. Wenn es eine neue Version der Dll und der Xml-Datei gibt, baue ich das Setup neu.

Das Problem ist jetzt folgendes: Ist die Anwendung auf einem PC bereits installiert, werde ich gefragt, ob ich reparieren oder entfernen will. Bei "Reparieren" möchte ich, dass jeweils die neuen Dateien "rüberkopiert" werden. Leider geht das zwar für die Xml-Datei, aber nicht bei der Dll.

Im Internet habe ich zwar gesehen, dass es wohl solche Probleme öfters gibt, allerdings gibt es keine Lösung die bei mir gehen würde.

Hat jemand ähnliche Erfahrungen gemacht und kann mir weiterhelfen?

Grüße

05.11.2008 - 12:51 Uhr

Ok,

prinzipiell konnte ich den Dienst wieder starten, indem ich bei "Anmelden" unter den Eigenschaften "Lokales Systemkonto" angewählt habe...die Anwendung geht zwar immer noch nicht, aber jetzt ist das Debuggen hoffentlich etwas einfacher...

Grüße

05.11.2008 - 12:36 Uhr

Hallo,

also pro Versuch, den Dienst zu starten bekomme ich zwei Fehlermeldungen in der Ereignisanzeige:

  1. Zeitüberschreitung (30000 ms) beim Verbindungsversuch mit Dienst Net.Tcp Port Sharing Service. - Ereigniskennung 7009

  2. Der Dienst "Net.Tcp Port Sharing Service" wurde aufgrund folgenden Fehlers nicht gestartet:
    Der Dienst antwortete nicht rechtzeitig auf die Start- oder Steuerungsanforderung. - Ereigniskennung 7000

Hilft das irgendwie weiter?!

Grüße

05.11.2008 - 08:15 Uhr

Hallo,

danke für die Links.

Zum ersten Link: Das Vorgehen hatte ich schon versucht, leider ohne Erfolg. Wenn ich dann auf Starten klicke, kommt eben genau der Fehler 1053 von oben...

Zum zweiten Link: Ja, Port Sharing wird in der Anwendung benötigt, daher kann das nicht deaktiviert werden.

05.11.2008 - 07:38 Uhr

Hallo,

gestern habe ich den SP1 von VS 2008 bei mir installiert. Dadurch wurde bei mir ein Bug in einem Setup-Projekt behoben.

Allerdings habe ich danach gemerkt, dass ein WCF-Programm nicht mehr läuft. Heute habe ich herausgefunden, dass dies am Net.Tcp Port Sharing Service liegt. Der mag nicht mehr starten. Ich bekomme immer den Fehler 1053: Der Dienst antwortete nicht rechtzeitig auf die Start- oder Steuerungsanforderung.

Kann mir jemand einen Tipp geben, wo ich nach dem Problem suchen muss?!

Gruß,
Markus

16.10.2008 - 18:16 Uhr

Hallo!

Also nochmals vielen Dank für die Ratschläge. Ich werde das entsprechend berücksichtigen.

Vielleicht finde ich ja zu diesem Thema noch ein paar Quellen im Internet.

Viele Grüße

16.10.2008 - 13:22 Uhr

Hallo!

Vielen Dank für deine Antwort...

In 3C der MS-PL lese ich, dass ich das Copyright usw. bewahren muss. Hm, ich würde dann einfach in den Ordner mit den MS-PL-Assemblys eine Kopie der MS-PL hinterlegen?! Reicht sowas aus zum "Bewahren des Copyrights"?

Was mir noch nicht ganz verstehe ist Punkt 3D: "If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license." Heißt das, dass die komplette Software dann "kompatibel" zur MS-PL sein muss (also alle Assemblys), oder nur die MS-PL-Assemblys eben oder die Assemblys, die die MS-PL-Assemblys nutzen?

Die Apache-Lizenz scheint mir ähnlich aufgebaut zu sein. Ich muss kennzeichnen, welche Teile unter Apache-Lizenz stehen. Da würde ich wieder einfach eine Kopie der Lizenz ins Verzeichnis legen.

Ist dieses Vorgehen auf den ersten Blick ok?!

Gruß

15.10.2008 - 21:03 Uhr

Hallo,

ich habe eine Frage bezüglich der oben genannten Open-Source-Lizenzen: General PL, Apache PL und Microsoft PL.

Meine Anwendung ist in C# geschrieben und hat folgenden Aufbau:1.Ein Basis-Assembly mit Referenz auf Apache PL-Assembly (log4net) 1.Darauf aufbauend weitere eigene Assemblys, aber ohne Verweise 1.Schließlich noch ein weiteres Assembly mit einem Verweis auf ein Microsoft PL-Assembly (Touchless SDK)

Jetzt würde ich gerne das ganze Paket (samt den externen Assemblys log4net und Touchless SDK) auf einer Homepage verfügbar machen. Prinzipiell würde ich für meinen eigenen Code die GPL nehmen (das ist allerdings noch änderbar).

Kann ich solch ein Paket veröffentlichen bzw. was muss ich außer Kopien der Lizenzen beilegen noch tun (Codedateien mit Header oder ähnliches?)?

Gruß,
confused

15.10.2008 - 10:14 Uhr

Ja, das dachte ich auch immer, aber ich glaube, da ist im externen unmanaged-Assembly was schief gegangen, weil mein managed-Objekt schon durch den GC aufgeräumt war, sodass dort dann die NullPointerException herkam. Visual Studio ist ja auch nicht zu dem Punkt gesprungen, wo die Exception auftrat. Es kam einfach nur das bekannte Exception-Fenster und keine weiteren Infos...ich konnte nicht auf Call Stack klicken und in der Exception gab es auch keine weiteren Infos...

15.10.2008 - 09:59 Uhr

Hallo.

Danke für den Link. Ich hab mir den Text dort mal durchgelesen, aber leider würde das mein Problem nicht beheben, weil ich keinen (!) Stack-Trace habe.

Mittlerweile habe ich aber auch rausgefunden, was mein Problem war: Ich hatte ein Objekt nur lokal in einer Methode definiert, und das wurde dann nach unbestimmter Zeit vom GC mitgenommen, und dann passierte wohl irgendwo drinnen eine NullReferenceException. Sobald ich mir das Objekt als Klassenvariable aufgehoben habe, war das Problem behoben! 🙂

Viele Grüße

14.10.2008 - 15:21 Uhr

Hallo,

ich habe heute eine C#-Anwendung geschrieben, die mit Hilfe einer unmanaged C++-libaray auf die Webcam zugreift (FYI: TouchlessLib).

Jetzt habe ich ein Problem, dass nach einigen Sekunden in meiner Anwendung eine NullReferenceException auftritt, mit keinerlei Informationen. D.h. ich kenne keine Codestelle, kein Dateiname, nichts, woher die Exception kommt. Kann ich zu der Exception irgendwie mehr Informationen bekommen, bzw. kann ich zumindest eingrenzen, dass die Exception aus dem unmanaged-Bereich kommt?!?!

Gruß,
confused

21.09.2008 - 11:20 Uhr

Hi,

@BerndFfm:
Habe ich das richtig verstanden: Es gibt im Netz irgendwo Implementierungen für Komponenten, die man auf ein OfficeRibbon ziehen kann? Wo muss ich da hinschaun?

Dann kann ich mir da mal den Code anschaun. Vielleicht sieht man, ob man ein bestimmtes Interface braucht oder so.

Wie gesagt, alles was ich möchte ist, meine eigene von MenuStrip abgeleitete Komponente auf das Ribbon zu ziehen, um ein "Outlook-Main-Menu" visuell designen zu können (ohne dieses ganze CommandBarButton/Popup-Degöns).

Viele Grüße

20.09.2008 - 11:36 Uhr

Hallo,

hm, ich kann nicht wirklich sagen, was für ein Ribbon ich habe. Der Typ ist zumindest Microsoft.Office.Tools.Ribbon.OfficeRibbon. Ist das Ribbon, das mit VS 2008 Prof. direkt mitkommt.

Manche der Standard-Windows-Forms-Komponenten sind da schon im Designer sichtbar (z.B. Timer, ImageList, ...). Andere fehlen dagegen.

Gruß

20.09.2008 - 09:03 Uhr

Hallo,

ich habe eine Klasse erstellt die von "MenuStrip" erbt. Die Klasse soll das Menu-Erstellen in Outlook verstecken, sodass man das Menu schön visuell in VS designen kann.

Leider kann meine KLasse dann aus der Toolbox nicht auf ein Ribbon gezogen werden. Mein Workaround ist bisher, ein eigenes UserControl zusätzlich anzulegen, auf dem ich dann das Menu designe. Das finde ich allerdings unschön.

Gibt es irgendein Interface das ich implementieren muss, damit meine Klasse auf ein Ribbon gezogen werden kann?

Grüße

22.08.2008 - 09:43 Uhr

Ok, sorry,

hat sich grade erledigt. Die Windows-Suche ist wohl nicht so erfolgreich wie man meinen könnte. Habe mal direkt in das Verzeichnis (Lokale Einstellungen\AppName...) geschaut, und da liegt dann diese user.config (mit richtigem Datum).

Komisch, dass die bei der Suche nicht gefunden wurde!

Also, hat sich erledigt!

22.08.2008 - 09:38 Uhr

Hallo,

ich bin gerade sehr verwirrt, was die Konfigurationsgeschichte angeht. Bei der Suche bin ich hier rüber gestolpert, und hoffe, mein Thema passt dazu.

@Herbivore
Du hast geschrieben, dass die .config-Dateien aus dem c:\Dokumente und Einstellungen...-Verzeichnis geladen werden. Also NICHT direkt vom selben Verzeichnis. Bei mir kann ich keine Datei finden in dem Verzeichnis finden, die mein Programm da anfasst.

Ich habe ein kleines Programm, das über eine app.config Einstellungen lädt, und auch dort wieder reinspeichert. Solange die .config-Datei nach dem Kompilieren da war, habe ich gedacht: Naja, da drin werden diese Einstellungen zur Laufzeit dann gespeichert, und wieder geladen.

Jetzt habe ich die .exe aber an eine andere Stelle verschoben, ohne die .config-Datei mitzunehmen, ja, ich habe sie sogar an der alten Stelle gelöscht, und trotzdem kann ich problemlos Einstellungen laden und speichern...

Wo zum Geier ist denn dann die Datei, in der die Einstellungen abgelegt werden. Habe mein ganzes Laufwerk nach .config-Dateien abgesucht, aber da ist keine dabei, die das richtige Änderungsdatum hat. Ich verstehe grad gar nix mehr! Wozu braucht man denn die .config wenns dann doch anders geladen wird?

Kennt sich damit jemand aus?

14.08.2008 - 13:44 Uhr

Vielleicht eine etwas späte Antwort, aber ich hatte selbiges Problem, und es ist eigentlich ganz einfach. Daher dachte ich, ich halte es hier für die Nachwelt fest:

**Die Wav-Datei kann man in seiner Anwendung einfach wie auch Bilder, Icons usw. als Resource einbinden. Dazu fügt man sie in eine Resources.resx-Datei ein. Jedes Windows-Forms-Projekt bringt so eine Datei bereits in dem Properties-Ordner mit.

Sobald die Datei da eingefügt ist, hat man ein seinem Programm einen super-einfachen Zugriff auf den Audio-Stream (sogar über Intellisense). Beispielsweise, um den SoundPlayer damit zu füttern.**

Hier der Code dazu:

System.Media.SoundPlayer player = new System.Media.SoundPlayer();
player.Stream = NameMeinerAnwendung.Properties.Resources.NameMeinerSounddatei;
player.Play();

Hinweis: Ich verwende VS 2008 sowie .NET 3.5, von daher kann ich nicht sicher sagen, ob man mit VS 2005 auch schon so komfortabel mit Resourcen umgehen kann.

Grüße

28.07.2008 - 09:15 Uhr

Im Beispiel könnte ich schon dirket von Component ableiten, aber im "echten" Programm kann meine Klasse nur noch ein Interface implementieren, weil sie schon von etwas anderem abgeleitet ist.

Wie schön wäre jetzt Mehrfachvererbung! 😉

P.S.: Was ich komisch finde: Die IComponent-Klasse im Beispiel, die im Projekt selbst liegt, wird bei mir schon in der Toolbox angezeigt. Die, die im separaten Assembly ist, allerdings nicht.

28.07.2008 - 08:34 Uhr

Hallo,

ich habe jeztt mal ein Beispiel erstellt, in dem man das Problem sieht, welches ich meine.

Ich habe ein Main-Projekt, das eine Form enthält. Im selben Projekt liegt eine "Component"- und ein "IComponent"-Klasse. Zusätzlich gibt es noch ein weiteres Projekt, welches nochmals eine Component- und IComponent-Klasse enthält.

Wenn ich jetzt die Form im Forms-Designer öffne, sehe ich alle Komponenten bis auf den IComponent aus dem zweiten Projekt.

Was muss ich am Code ändern, damit die IComponent-Klasse aus dem zweiten Projekt auch sofort im Forms-Designer angezeigt wird?

Grüße

26.07.2008 - 10:16 Uhr

Hallo,

ich habe eine Klasse, die IComponent implementiert. Leider kann ich nicht direkt von Component ableiten, da ich die Vererbungshierarchie woanders brauche.

Ich hätte gerne, dass diese Klasse in der Toolbox erscheint. Ich habe Klassen, die von Component erben, und die tauchen automatisch in der VS-Toolbox auf. Die Klasse, die IComponent imlementiert aber nicht.

Ich habe mal geschaut, welche Attribute Component hat und die an meine Klasse drangehängt, aber sie taucht trotzdem nicht auf. Das TooboxItem(true)-Attribute hat auch nicht geholfen.

Gibts da irgendeinen Trick damit die Klasse im Designer auftaucht?

Grüße,
confused

P.S.: Als Nachtrag: Ich habe VS 2008 sowie eine .NET 3.0 Anwendung.

29.06.2008 - 10:41 Uhr

Hallo zusammen,

ich habe ein kleines Problem mit meinem Netzwerkhandler der über einen UDP Client arbeitet. Das Protokoll das ich umsetzen möchte ist simpel: Der Client schickt so lange HELLO-Packete an den Server, bis dieser hochgefahren ist und antwortet. Das Senden passiert bei mir einfach über die Methode "_wrappedClient .Send(data, data.Length, endpoint);".

Es kommt des öfteren vor, dass der Client 10-20 Pakete schickt, bevor der Servor hochgefahren ist.

Gleichzeitig polle ich im Client in einem Thread die verfügbaren Daten aus dem Netzwerk. Der Client soll von allen IPAdressen auf allen Ports empfangen (_wrappedClient = new UdpClient(new IPEndPoint(IPAddress.Any, 0))).

Der Empfangscode sieht bei mir so aus:

while (_isRunning)
{
  try
  {                
    while (_wrappedClient.Available > 1 && _isRunning)
      Raise(_wrappedClient.Receive(ref _remoteIpEndPoint));                    
    Thread.Sleep(10); 
  }
  catch (Exception ex)
  {
    _logger.Error("Error in receiving loop", ex);
  }
}

Das Problem ist jetzt Folgendes: Sobald der Server da ist, fliegen genau in dieser Methode genau so viele Exceptions wie ich vorher Hello-Pakete geschickt habe jeweils mit dem Fehler:

System.Net.Sockets.SocketException: Eine vorhandene Verbindung wurde vom Remotehost geschlossen
   bei System.Net.Sockets.Socket.ReceiveFrom(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint& remoteEP)
   bei System.Net.Sockets.UdpClient.Receive(IPEndPoint& remoteEP)

Anschließend funktioniert die Kommunikation ohne Probleme.

Natürlich fängt der Exception-Handler das ab, allerdings finde ich das sehr unschön, wenn da 20 Exceptions auf einmal fliegen.

Hat da jemand einen Rat für mich?

Grüße,
confused

edit: Als Nachtrag: Ich teste das bei mir momentan mit Server + Client auf einem Rechner, d.h. ich starte den Client auf meinem Rechner, warte dann ein bißchen und starte dann den Server. Sobald der Server da ist, kommen die Exceptions.

08.02.2008 - 15:49 Uhr

Hallo!

Tut mir leid dass ich das Thema nochmal aufrolle, aber ich habe selbiges Problem.

Ich kenne jeweils zwei Polygone und möchte testen ob sie sich scheiden. Die Region Klasse habe ich gefunden. Schneide ich nun die Region mit dem ersten GraphicsPath mit dem anderen GraphicsPath, dann würde ich gerne die Region testen, ob sie leer ist (Region.IsEmpty).

Das Problem ist, dass ich dafür ein Graphics Objekt bräuchte, dass ich aber an der Stelle, an der der Test stattfindet nicht zur Verfügung habe. Weiß da jemand eine Lösung?! Vielleicht geht es ja auch einfacher?!

Grüße,
confused

02.02.2008 - 11:24 Uhr

Hallo!

Ich wollte auch gerade einmal ein bißchen mit C# und DirectX rumspielen.

Ich habe gesehen, dass das aktuelle SDK (zumindest denke ich dass es das aktuelle ist, -> November 2007) über 400 MB groß ist. Da ich nur ein klein wenig testen möchte, wollte ich fragen, ob es nicht auch geht, ganz "normal" nur DirectX zu installieren, und dann die entsprechenden Dll's zu suchen und diese zu referenzieren?

Grüße

05.01.2008 - 20:26 Uhr

Hallo,

ich habe MCI_CAPTURE gefunden...damit wird der aktuelle Frame in eine Datei abgelegt...ich versuche damit mal zu arbeiten...vielleicht ist es ja schnell genug um den Film noch ansehbar zu haben! 🙂

Nur Infohalber: Ich möchte den Frame in eine Textur einer 3D-Graphics Engine stecken...damit möchte ich quasi das Video in der 3D-Scene auf der Textur sehen. Die Engine selbst kann das nicht, von daher muss man das von Hand machen...und da braucht man eben die Framedaten als byte[] und updated damit dann die Textur...

Grüße

05.01.2008 - 13:28 Uhr

[EDIT]Abgeteilt von [Tutorial] Audio- und Videowiedergabe mit MCI[EDIT]

Hallo,

ich hätte mal wieder ein Frage zu MCI.

Ist es möglich an die Frames eines Videos ranzukommen?! Im besten Fall möchte ich ein byte[] haben, in dem die Pixelfarben drinstehen... 🙂 ...ich könnte mir vorstellen, dass man mit dem IntPtr das dem Handle entspricht, in dem das Video angezeigt wird, etwas machen kann...

Falls das nicht mit MCI geht, was könnte denn eine Alternative sein?!

Grüße

17.12.2007 - 13:54 Uhr

Hallo,

ok, igrendwie habe ich wohl was falsch gemacht...nach ein paar Versuchen ging es ganz einfach mit dem Attribut [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] an der Property und den Attributen [Serializable] und [TypeConverter(typeof(ExpandableObjectConverter))] an der Klasse. Weiß nicht warum es vorher nicht ging...

Vielen Dank für die Hilfe!

17.12.2007 - 13:14 Uhr

Ok, es lag wohl daran, dass ich VS nochmal starten musste...jetzt kommt die Exception nicht mehr...

Allerdings bekomme ich auch nicht das erwartete Verhalten...ich habe erwartet, dass der WindowsFormsDesignerCode dann die gesetzten Werte enthält...allerdings sehe ich da nichts...

Hier nochmal das was ich gerne hätte:

In der InitializeComponent-Methode meines UserControls soll Code stehen, der Felder des Objektes setzt, welches sich innerhalb meines UserControl-Objektes befindet. Habe ich z.B. ein "Options"-Objekt mit einem Feld "MaximumCount", dann würde ich gerne haben, dass z.B. die Zeile

this.myUserControl1.Options.MaximumCount = 5

steht...

17.12.2007 - 12:32 Uhr

Hallo,

vielen Dank für die Antwort...ich bin jetzt schon etwas weiter damit gekommen...ich habe die Property, für das die Felder im Designer gesetzt werden sollen mit den Attributen [TypeConverter(typeof(MyExpandableObjectConverter))] und [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] versehen. Den TypeConverter sieht so aus:

public class MyExpandableObjectConverter : ExpandableObjectConverter
    {
        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            if (destinationType == typeof(InstanceDescriptor))
            {
                return true;
            }

            // Always call the base to see if it can perform the conversion.
            return base.CanConvertTo(context, destinationType);
        }

        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            // other TypeConverter operations go here...
            //
            if (destinationType == typeof(InstanceDescriptor) && value is HordeOptions)
            {
                //HordeOptions options = (HordeOptions)value;
                ConstructorInfo ctor = typeof(MyType).GetConstructor(new Type[] { });
                if (ctor != null)
                {
                    return new InstanceDescriptor(ctor, new object[] { });
                }
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }
    }

Ändere ich jetzt im Designer die Werte in der aufgeklappten Property, dann kommt ein komischer Fehler: Code generation for property 'PropertyName' failed. Unable to cast object of type 'MyType' to type 'MyType'.

Ich denke also, dass ich schon einen Schritt weiter bin als vorher...nur wie mache ich jetzt weiter?!

16.12.2007 - 17:20 Uhr

Hallo,

ich habe mir ein eigenes UserControl gebastelt. Das kann man dann schön über den WindowsForms-Designer in eine WindowsForm adden. Und was auch schön ist: Man kann die Properties, die ich zusätzlich ins UserControl gebastelt hab, verändern.

Allerdings funktionniert das bei mir irgendwie nur bei einfachen Typen wie int oder bool.

Ich möchte aber folgendes: Mein UserControl hat ein Objekt, das ich mit dem ExpandableObjectConverter und einer Get-Property im FormsDesigner sichtbar gemacht habe. Verändere ich jetzt im Designer die Werte, dann hätte ich gerne, dass das Objekt das ich verändere dann auch beim Starten der Anwendung diese Werte enthält.

Nur wie mache ich das am besten? Momentan erstelle ich das Objekt bei der Definition, also private MyType dasObject = new MyType()...dadurch kann ich die Werte dann im Designer verändern, allerdings gehen die geänderten Werte dann beim Starten der Anwendung "verloren". Ich habe es dann auch mal mit einem Singleton probiert, aber natürlich geht das auch nicht...gibt es für sowas irgendwelche "Standardstrategien"?

Grüße,
confused

03.12.2007 - 09:52 Uhr

Hallo,

ich habe gerade das Problem gefunden. Es war das ReliableSession.Enabled Attribute. Ich wollte gerade damit erreichen, dass der Channel überwacht wird, aber es war wohl genau andersrum. Jetzt habe ich ReliableSession auf false gestellt, und nun hat der Channel immer den aktuellen State und die Events kommen nun auch an!

Grüße

30.11.2007 - 21:03 Uhr

Hallo,

in meiner WCF Anwendung speichere ich beim Serivce in einer Liste Callbacks für mehrere angemeldete Clients. Das Problem ist, dass ich auf Serviceseite nicht mitbekomme, wenn ein Client sich beendet.

Ich habe mich für den Faulted und Closed-event des Callback-Channels (auf Serviceseite) angemeldet. Leider werden diese Events nicht getriggert, wenn der Client sich beendet.

Das Problem ist nämlich, dass wenn ich die Callbacks durchgehe, und jeweils eine Methode darauf aufrufe, dass bei den Callbacks, die nicht mehr erreichbar sind der Service einige Zeit blockiert.

Ich verwende das NetTcpBinding und habe ReliableSession.Enabled auf TRUE gestellt.

Kann mir jemand helfen?!

Grüße,
confused

26.09.2007 - 22:27 Uhr

Tja,

so wies ausschaut muss ich es wohl echt selbst machen. Dann erzeug ich mal ne Menge an EventHandlern! 😉

Grüße und Danke für die Antworten...

26.09.2007 - 19:57 Uhr

Hallo!

Ich habe ein UserControl, in dem weitere Controls sind. Ich möchte die Events, die von den inneren Controls (z.B. einer Textbox) fliegen, nach außen weitergeben. Ich habe es nur auf Maus- und KeyEvents abgesehen.

Weiß jemand, ob es einen schnellen Weg gibt, mein Problem zu lösen? Ich möchte mich eigentlich nicht manuell im UserControl für alle relevanten Events der Controls anmelden und die weiterleiten...

Grüße,
confused

P.S.: Bei Forms gibt es ja z.B. diese KeyPreview-Eigenschaft, die glaube ich das für KeyEvents tut...aber leider nicht in den UserControl und auch nicht für MouseEvents.

20.09.2007 - 23:00 Uhr

Ok, ich habs jetzt mal so gestellt, dass der Timer nur tickt, wenn eine 16/tel rum ist. Scheint auch nicht schlechter zu sein also so schnell wie möglich zu ticken. 🙂 So ganz zufrieden bin ich aber nicht, aber vielleicht liegt das auch einfach an der Performance meines Laptops!

Aber schade ist es schon irgendwie...ich meine eine mp3 wird doch auch gleichmäßig und im Takt abgespielt und das von eigentlich allen Playern...irgendwie muss man das doch hinkriegen!

Naja, auf jeden Fall mal vielen Dank für die Antworten!

Grüße

20.09.2007 - 21:50 Uhr

Vielleicht kann man Microsoft ja mal nach ner Echtzeitvariante fragen! 😉

Also wenn ich den Thread laufen lasse, dass liegt die Auslastung bei mir so ca. bei 50%.

Ich hatte bei meinem Programm zwei Alternativen: Entweder ich lasse den Timer dann ticken wenn ich es brauche. Das bringt mit sich, dass der Timer sehr genau ticken muss. Nämlich z.B. bei jedem 16/tel Taktschlag. Oder ich lasse eben irgendwas (Timer oder Thread) so schnell wie möglich laufen, damit ich so gut wie möglich den 16/tel Takt treffe. Letzteres ist mein bisheriger Ansatz.

Könnte ein Timer im 16/tel-Takt genauer sein?!

20.09.2007 - 21:31 Uhr

Hi!

Also wenn du Visual Studio hast, dann ist das mit dem Menu nicht schwer. Das Menu machst du einfach indem du ein MenuStrip aus der Toolbox auf deine Form ziehst. Dann kannst du dort die Menustrutkur bequem im Designer angeben. Dann klickst du einfach doppelt auf eines der dort erstellten Menuitems, und schon bist du in der Klickmethode. Da kannst du dann einfach myAboutBox.ShowDialog(); angeben.

Die myAboutBox kannst du in der Form als globale Variable anlegen, und entweder im Konstruktor oder im Load-Event der Form erstellen.

Hoffe das hat geholfen!

Grüße

20.09.2007 - 21:23 Uhr

Was spricht denn gegen folgenden Code?

string ich = "a#b#c#";
ich = ich.Replace("#","");

Ach ja: Auch wie bei mir muss man bei "somestring".Remove(...) beachten, dass der geänderte String als Rückgabewert zurückkommt. Der string auf dem man es aufruft, bleibt unverändert.

20.09.2007 - 21:11 Uhr

Hallo,

ich hoffe ich schreibe hier an der richtigen Stelle. Leider habe ich im Netz nichts passendes gefunden.

Ich habe ein Programm, dass dynamisch MidiEvents (Noten) erzeugt. Das Programm bekommt die Noten von einer anderen Anwendung. Da es nun bei der Musik darauf ankommt, dass man möglichst zeitgenau die Noten anspielt, möchte ich sehr sehr performant in einer Schleife prüfen, wann eine Note angespielt werden soll, und wann sie wieder beendet werden soll. Es handelt sich um ca. 20 Noten gleichzeitig. Die Startzeit ist jeweils mit einem DateTime angegeben und in der Schleife prüfe ich bei jeder Note, ob die Startzeit der Note schon hinter DateTime.Now liegt. Falls ja spiele ich die Note an.

Zuerst hatte ich einen Multimediatimer (siehe Google). Den habe ich so schnell wie möglich Ticken lassen. Jetzt dachte ich, dass ein Thread das doch genauso schnell macht, wenn nicht sogar schneller. Einfach die Überprüfungen der Startzeiten in der Schleife machen, und fertig.

Von Gefühl her war der Timer aber irgendwie besser...daher meine Fragen:

Ist generell der Timer schneller, oder könnte es auch sein, dass der Thread schneller ist?!

Kann es sein, dass ich beim Timer z.B. zwei mal gleichzeitig in der Methode bin?! Das könnte doch passieren, wenn ein neuer Tick kommt, und ich vom letzten Tick noch nicht mit den Überprüfungen fertig bin?!

Gibt es noch eine schnellere Methode um die Überprüfungen zu machen!?

Grüße

28.07.2007 - 18:29 Uhr

Ok, ich habe den Fehler gefunden:

Aus irgendeinem Grund muss das Programm, das ausgeführt wird und diese MCI-Sachen aufruft mit [STAThread] gekennzeichnet sein.

Kriegt man dieses Problem noch in den Griff?! Ansonsten bin ich soweit fertig! 🙂