Laden...
S
Somakia myCSharp.de - Member
Data Analyst Specialist Hessen Dabei seit 08.09.2010 269 Beiträge
Benutzerbeschreibung

Forenbeiträge von Somakia Ingesamt 269 Beiträge

14.03.2012 - 14:35 Uhr

Hallo liebes myCSharp,

ich hänge grad an einem für mich eher kniffligen Problem im Zusammenhang mit dem Ableiten einer Klasse und Events:
Ich möchte in meiner abgeleiteten Klasse bestimmte Events der Basisklasse für den Benutzer meiner Klasse "verbergen", soll heißen, dass er diese Events nicht benutzen soll.

Nehmen wir als Beispiel mal die Klasse "Control":

public class MyControl : Control
{
    //Basisevent, beispielsweise MouseMove, "verstecken"
}

Ein Entwickler, der jetzt MyControl verwendet, soll nicht die Möglichkeit haben, einen Eventhandler an zum Beispiel MouseMove zu hängen... er soll nicht einmal von der Existenz dieses Events wissen wenn möglich. Soll heißen: Weder der Designer noch Intellisense sollen bei MyControl das Event anzeigen!

Gibt es da eine Möglichkeit und wenn ja: wie kann ich das bewerkstelligen?

P.S.: Ich habe es bereits hinbekommen, dass das Event nicht mehr im Designer im Eigenschaften/Event-Fenster angezeigt wird. Trotzdem könnte man immer noch im Code dahergehen und sich an das Event hängen, auch Intellisense zeigt es noch an.
Meine Ansätze dahingehend waren zum einen

[EditorBrowsable(EditorBrowsableState.Never)]
[Browsable(false)]
private new event MouseEventHandler MouseMove;

und zum anderen über einen eigenen ControlDesigner

public class MoveableTextBoxDesigner : ControlDesigner
{
	protected override void PreFilterEvents(System.Collections.IDictionary events)
	{
		base.PreFilterEvents(events);
		events.Remove("MouseMove");
	}
}

Ich bedanke mich schonmal im Voraus für jegliche mir angebotene Hilfe.
so far,
Karill Endusa

//edit, p.p.s.:
Mir ist bewusst, dass sich mein konkretes Beispiel eher auf WinForms bezieht und daher wohl durchaus besser dahin passen könnte, doch geht es mir bei meiner Frage auch hauptsächlich um das Verstecken von Events beim Ableiten allgemein und es muss sich bei der Basisklasse nicht zwangsläufig um ein Control handeln!

12.03.2012 - 09:21 Uhr

Bei Combobox A das TextChanged/SelectedIndexChanged Event abonieren, über die Eigenschaft .Text oder .SelectedItem.ToString() (je nachdem, wie die Combobox aufgebaut ist) den Wert auslesen und der .Text Eigenschaft von Combobox B zuweisen...
//edit: bzw. wenn die auswählbaren Werte in Combobox B auch zur Auswahl stehen wie in A, musst du da auch das SelectedItem richtig anpassen....

Beachte bitte vorsorglich [Hinweis] Wie poste ich richtig? Punkt 1.1/1.1.1, denn das gehört zu den absoluten Grundlagen

28.02.2012 - 10:20 Uhr

Wie schauts denn mit der AutoSizeMode der einzelnen Spalten aus? Nicht dass diese dir irgendwo dazwischenhaut... soweit ich das beurteilen kann steht zumindest die "Contract Start Date" auf Fill.

so far
Karill

13.02.2012 - 09:26 Uhr

Deine eigenen Methoden brauchen dafür entsprechende XML-Kommentare, Summary genannt: <summary> (C#-Programmierhandbuch)
Wenn du bei VS alles auf Standard hast, reicht es normalerweise aus, über einer eigenen Methode /// (3 Slash-Zeichen) hinzuschreiben... der Summary-Part wird dann autogeneriert und du musst nur noch den Text an die entsprechenden Positionen schreiben.
Wenn du dann eine DLL draus machen willst, solltest du dran denken, dir das XML-File generieren zu lassen:
Projekteigenschaften -> Reiter "Erstellen" -> relativ weit unten bei "Ausgabe" -> "XML Dokumentationsdatei"

08.02.2012 - 10:30 Uhr

Zusatzinformation:
Die Shell32.dll muss man nicht einmal via P/Invoke aufrufen, sie lässt sich einfach als normaler Verweis hinzufügen (es wird dann automatisch eine Interop.Shell32.dll hinzugefügt)
Dann kann man mit Shell _Shell = new Shell(); ein Shell-Objekt erstellt werden und über _Shell.NameSpace(string s); erstellt man dann die anderen benötigten Objekte, zum Beispiel Shell32.Folder etc.
Und darüber geht dann auch garantiert das Löschen mit der Windows-Funktion

so far
Karill Endusa

07.02.2012 - 13:20 Uhr

Nun, Freund Google scheint dir nicht helfen zu wollen, denn ich finde damit eine Lösung zu deinem Problem:
Displaying custom HTML in WebBrowser control

06.02.2012 - 12:04 Uhr

Da du dich im PostBack ja wieder auf der Codebehind-Seite befindest, solltest du einfach über alle Controls (und deren Controls, Stichwort "Rekursion") iterieren können.

foreach(WebControl control in this.Controls)
	{
		//Wenn RadioButton -> Wert auslesen, ansonsten eine Ebene tiefer
	}

Je nachdem, wie du sie gruppiert hast, solltest du ja auch wissen, auf welcher "Ebene" die Radio-Buttons liegen
Oder du iterierst direkt nur über die RadioButtons von bestimmten Gruppen

01.02.2012 - 14:21 Uhr

Stichworte hier sind XmlDocument-Klasse und XDocument-Klasse

und nur weil du schon zugibst, dass du einen Crosspost gemacht hast, ändert das Nix an der Tatsache, dass es gegen die Regeln verstößt!

01.02.2012 - 10:03 Uhr

Für ein ähnliches Problem gibt es sogar schon einen FAQ-Eintrag, der Hintergrund ist zwar ein Anderer aber das Vorgehen sollte gleich sein:
[FAQ] Event nur bei Benutzeraktion auslösen, nicht bei programmtechnischer Änderung

01.02.2012 - 08:51 Uhr

Was man auch noch machen könnte, wäre, die Windows-Mittel zu verwenden.
Ich rede hier explizit von den Shell32-Methoden, auf welche man durch das Einbinden der Interop.Shell32.dll recht einfach nutzen kann.
Leider ist da nicht viel mit Dokumentation, also man müsste ein wenig im Internet rumsuchen, aber nach ein bisschen Hin und Her kann ich nun ohne Probleme Zip-Dateien zumindest schonmal entpacken.
Wer also auf "externe" (mehr oder minder, da Shell32 IMHO ja nun nicht wirklich zu den .NET-Boardmitteln gehört) Komponenten verzichten möchte, würde mit der Shell32 IMHO für die einfachen Aufgaben Alles haben, was er braucht.

so far
Karill

18.01.2012 - 16:16 Uhr

Er möchte, soweit ich das verstanden habe, dass das ganze wie ein Hyperlink in HTML funktioniert (vom Optischen her), also in HTML wäre es

<a href="file:///\\C://Users//AppData//demo//Roaming//Test//otto.eks">Aufgabe</a>
18.01.2012 - 10:17 Uhr

Noch ein Hinweis, wie man herausbekommen könnte, bei welchem Schritt man gerade ist:
Im DocumentComplete Event den Quelltext der geladenen Seite nach Stichwörtern untersuchen.
Es sind eigentlich immer bestimmte Elemente vorhanden, welche einem quasi anzeigen, auf welcher Seite man sich gerade befindet

17.01.2012 - 16:48 Uhr

Wäre da nicht IMHO gleich ein SplitContainer besser für geeignet?
Hört sich auf den ersten Blick zumindest danach an.

11.01.2012 - 16:03 Uhr

richtiger Bereich wäre Grafik und Sound.

Das ist recht simpel:
Image-Objekt aus deinem Bild erstellen
Graphics-Objekt vom Image-Objekt erstellen
Graphics.DrawString verwenden (MSDN Graphics.DrawString)
Graphics disposen
Image saven
Image disposen

edit:
bzw., um das Disposen nicht selbst vornehmen zu müssen, mit using arbeiten!

edit2:
Ich hab noch ne Seite rausgesucht, auf der das recht gut (wie ich finde) erklärt ist:
switchonthecode.com - How to draw text on image

11.01.2012 - 15:45 Uhr

ein Event ist kein boolscher Wert, insofern ist das schonmal der falsche Ansatz.

foreach(Control ctrl in groupBox1.Controls)
{
    if(ctrl.getType() == typeof(TextBox))
    {
        ((TextBox)ctrl).TextChanged += new System.EventHandler(groupBox1_AnyTextBox_TextChanged);
    }
}

private void groupBox1_AnyTextBox_TextChanged(object sender, EventArgs e)
{
    //do something
}
11.01.2012 - 08:46 Uhr

Gehört IMHO nicht in den Quellcode, sondern in die Versionsverwaltung. Ich nur Azubi, ich nix angeschlossen an Versionsverwaltung (welche im Übrigen auf dem Entwickler-Rechner meines Ausbilders läuft, welches ein Laptop ist, welches nur hier ist wenn er auch da ist)

10.01.2012 - 16:19 Uhr

Ich kann dazu nur sagen, dass auch hier in der Firma die Philosophie "der Methodenname sagt aus, was die Methode macht" gefahren wird.
Demnach finden sich nicht allzu viele Kommentare in unseren Projekten, und waren bisher auch nicht nötig.

Mitunter sind Konstanten mit <summary> versehen, weil der Name mitunter zu lang werden würde, um zu beschreiben, was letztendlich in der Konstanten steht, aber auch das ist selten der Fall.

Die meisten Kommentare in den Projekten hier sind eigentlich Anmerkungen zu Änderungen am Quellcode im Format
//<Programmierer-Kürzel> <Datum> <Änderungsanmerkungen/-hinweise/-gründe>
und die halte ich dann sogar für sinnvoll!

so far
Karill Endusa

10.01.2012 - 16:14 Uhr

Zuerst einmal möchte ich sagen: Ich kenne den ZedGraph nicht und übernehme keine Garantie für meine folgende Aussage!

So, nun aber:
Enthalten deine Daten/Datumsangaben denn Werte, welche eben vor 2000 liegen?
Ich könnte mir gut vorstellen, dass der ZedGraph diese dann auch unbedingt anzeigen möchte...

Noch einmal der Hinweis:
Es handelt sich hierbei nur um eine Vermutung.

so far
Karill Endusa

10.01.2012 - 14:59 Uhr

Wie hast du die .cur - Datei denn erstellt?
Wenn du einfach die Dateinamenserweiterung bei einem Bild geändert hast, würde es mich nicht wundern, dass diese Meldung kommt... es ist eine Meldung, die zum Beispiel bei Bildprogrammen (GIMP als gutes Beispiel hierfür) öfter vorkommt, wenn die Dateiendung nicht zum Dateiheader passt 😃

06.01.2012 - 23:48 Uhr

Wo führst du diesen Code aus?
Eventuell hilft es schon, wenn dieser von der aktuellen Position in das Form.Load-Event verfrachtet wird?

06.01.2012 - 13:04 Uhr

Schonmal versucht, das Objekt, welches du aus der Zwischenablage bekommst, zu casten in dein Objekt?

Weitere Infos siehe auch [Tipp] Casten aber richtig: () / is / as

05.01.2012 - 15:02 Uhr

Aus meiner Sicht macht die Verwendung von privaten Properties nur wirklich Sinn, wenn diese zwingend einer besonderen Logik unterliegen müssen (Also wenn ein Wert in einem bestimmten Wertebereich liegen muss).

Dies hätte sogar den (möglichen) Vorteil, dass man zu einem späteren Zeitpunkt eine mögliche Validierung der Daten weglassen/schmälern könnte.

Aber das hat herbivore eigentlich auch schon gesagt:

Private Properties machen m.E. nur in Ausnahmefällen Sinn, z.B. wenn der Setter mehr tut, als das Feld zu setzen.

05.01.2012 - 12:41 Uhr

Bei Gleichheit wäre es eine Kante. Stimmt, und weniger weiße als nicht-weiße Pixel sollte allein schon aus der Logik heraus nicht möglich sein.
Damit ließe sich was anfangen.

05.01.2012 - 12:34 Uhr

@Coffeebean ich glaube nicht, dass das so geht. Deine Theorie mit den 3 Pixeln trifft auf rechte Winkel zu, aber wenn die Ecken spitzer oder flacher sind, können auch mehr oder weniger benachbarte Pixel non-white sein.

05.01.2012 - 12:20 Uhr

Was noch bestimmt möglich wäre, auch wenns recht subtil aus meiner Sicht ist:
Du suchst dir (wie auch immer) einen Randpunkt deines (nicht Rechtecks sondern) beliebigen Vierecks und folgst dann seinem Rand einmal außenrum (bis du wieder beim ersten Pixel bist). Bei jedem "Richtungswechsel" muss zwangsläufig ja ein Eckpunkt sein.

04.01.2012 - 15:20 Uhr

Ob einfach oder nicht, im von TH69 angesprochenen Artikel (dem in seiner Signatur) steht sogar eine Erklärung dazu, warum man genau das nicht machen sollte.

so far
Karill

04.01.2012 - 15:04 Uhr

Da es sich um Settings, also Einstellungen handelt, sollte eigentlich [Tutorial] Konfigurationsmodell im .NET Framework Alles erklären, was benötigt wird. Aber auch das gehört zu den Grundlagen.

so far
Karill

04.01.2012 - 09:20 Uhr

Wenn dein Problem nur beim Jahreswechsel liegt, dann hast du doch sicher schon ein wenig Code, oder?
Es wäre wirklich hilfreich, wenn wir diesen als Ausgangspunkt nehmen könnten. Soll heißen: Es wäre nett, wenn du ihn uns noch hier zur Verfügung stellen könntest, damit wir anhand dessen herausfinden können, was da nicht stimmt.

So far
Karill

03.01.2012 - 16:08 Uhr

Ich finde, man sollte schon verstehen, wie genau ADO.NET funktioniert, anstatt sich Code erzeugen zu lassen und dann aber "wie der Ochs' vor'm Berge steht", wenn man noch Anpassungen machen muß.){gray}

Zumindest trifft das so auf mich zu.
Zitat: "Warum sollten wir Alles per Hand machen, wo doch Visual Studio das viel besser kann als wir je könnten... und vor Allem schneller!"

03.01.2012 - 12:33 Uhr

Dein DataView hat auch keine Daten, du filterst ein eh schon leeres DataView.
D.h. du musst zuerst deine Daten in das DataView bekommen, welches du dann Filtern kannst!

03.01.2012 - 10:11 Uhr

Es gibt sicher mehrere Herangehensweisen für dieses Problem. Entscheidend ist, ob es sich dabei um eine Client-Server Architektur handelt oder ob das Wort "Client" hier gar Nichts mit einer solchen Konfiguration zu tun hat.

Bei einer Client-Server Architektur wäre es aus meiner sicht am "einfachsten", wenn auf dem Server ein entsprechendes Flag gesetzt wird, dass der TreeView gerade bearbeitet wird. Alle anderen Clients bekommen dann entweder vom Server eine Nachricht und sperren ihr TreeView, oder aber im Moment wo jemand bei seinem Treeview Daten bearbeiten will, fragt der Client den Server nach dem Flag ab... ist es true, also wird er gerade schon von einem anderen Client bearbeitet, kannst du eine Nachricht ausgeben lassen, ansonsten gehst du in den Bearbeitungsmodus und setzt das Flag.

Wenn kein Server verfügbar ist, läuft es auf ein ähnliches Verfahren via IPC (Inter-Process-Communication) hinaus, nur das hier jeder Client das entsprechende Flag hat und der bearbeitende Client eine Rundnachricht an alle anderen schicken muss, dass er gerade die Daten im TreeView bearbeitet.

Soweit meine Theorie dazu
so far
Karill Endusa

03.01.2012 - 08:54 Uhr

Ich weiß jetz nicht direkt, ob es dafür ein Addon gibt, aber eine Alternative wäre doch u.U. ein so genannter Bookmarking-Dienst?!
Ein interessanter Thread dazu wäre dann Welchen Bookmarking-Dienst verwendet ihr?

02.01.2012 - 16:48 Uhr

Ich glaube, es würde schon stark helfen, wenn du nicht für jeden Datensatz die Verbindung erst öffnest und wieder schließt.
Das sind beides IMHO recht zeitaufwendige Operationen... besser wäre:
Verbindung öffnen
Alle Datensätze schreiben
Verbindung schließen

Außerdem solltest du das besser nicht im GUI-Thread machen, siehe auch [FAQ] Warum blockiert mein GUI?

22.12.2011 - 14:21 Uhr

Außerdem stellt sich mir dann die Frage: Warum FindForm() ?
da this ja die aktuelle Form schon ist, müsste es auch direkt gehen

this.Width += 1180;

Achte bitte darauf, dass das Form nicht zu groß für den Bildschirm des Anwenders wird... der würde sich arg freuen, wenn das der Fall wäre.

22.12.2011 - 08:58 Uhr

Also, ich habe schon einmal mit der DLL (AutoItX3.dll) gearbeitet.
Man kann sie, wie Hausdrache5 es auch gemacht hat, einfach als Verweis hinzufügen.
Über

AutoItX3Lib.AutoItX3Class au3xClass = new AutoItX3Lib.AutoItX3Class();

kommt man dann an die Befehle ran, so far so good.
In der Hilfe-Datei von AutoIt steht außerdem:

Also supplied is a combined COM and DLL version of AutoIt called AutoItX that allows you to add the unique features of AutoIt to your own favourite scripting or programming languages!

Damit sollte die Frage, ob nativ oder .NET, ja schonmal geklärt sein 😃

19.12.2011 - 14:07 Uhr

Hallo Lolly,

was du suchst sind Befehle aus der user32.dll
Das Stichwort hierzu heißt P/Invoke... und viele Infos dazu findest du auf pinvoke.net

Zu erwähnen wären hier:
pinvoke.net - SetCursorPos
pinvoke.net - mouse_event

Auf der Seite findest du auch gleich die "User Defined Types", also z.B. Enumerationen, die du für den Aufruf der Funktion gebrauchen kannst.

//EDIT:
Hab grad gesehen, dass SetCursorPos gar nicht benötigt wird... mouse_event hat entsprechende Parameter...

so far
Karill

16.12.2011 - 22:29 Uhr

Was du suchst ist das String.Split().

Um ehrlich zu sein ist das aber absolutes String-Grundlagenwissen 😃

14.12.2011 - 16:27 Uhr

(...)die Tabelle hat allerdings keinen PK.(...)

Entschuldige, aber das wage ich zu bezweifeln.
SQLite hat eine eingebaute "rowid"-Spalte in jeder Tabelle, der Wert ist eindeutig und autoincrementiert... es handelt sich sozusagen um einen automatischen PK: SQLite Autoincrement

14.12.2011 - 15:17 Uhr

Da es nur ein Wert ist, solltest du mit ExecuteScalar arbeiten und den return-Value direkt nach int casten können.

14.12.2011 - 12:28 Uhr

Hallo gfoidl,

ich glaube, zumindest habe ich das soweit verstanden, er möchte diese Update-Funktionalität von ClickOnce bei einem normalen Setup (nicht Click-Once) haben.

Hallo Renator,

ich glaube, dass du da um eine Art "manuelle" Lösung nicht herum kommst. Mir ist nicht bekannt, dass das Standard-Setup eine solche Funktion von Haus aus unterstützt.
Für dich könnte aber vllt. auch updateSystem.NET interessant sein

so far
Karill

13.12.2011 - 15:36 Uhr

Dann leite deine Klasse doch bitte nicht von Form ab, denn dadurch ist der Eindruck entstanden, es handele sich bei deiner Klasse um eine Form 😉

13.12.2011 - 15:20 Uhr

2 Möglichkeiten zur Abhilfe, anhand der von caldicot schon genannten Information:

  1. Den Zugriffsmodifizierer auf Public schalten. Dies geht über die "Modifiers"-Einstellung (Entwurfsansicht)
  2. In deiner Form eine Public Method erstellen, die da zum Beispiel "ClearListView1()" heißen könnte.

Mir persönlich gefällt Lösung 2 besser 😉

so far
Karill

13.12.2011 - 13:42 Uhr

im privaten Bereich stimme ich aequitas (bedingt) zu... andere Musikrichtung halt, aber so hat jeder seinen Geschmack.

Auf der Arbeit, nun ja... mein Chef hat was gegen laute Geräusche, nennen wir es mal so 😃

Da ich auf Arbeit aber so gut wie nie ein interessantes "Ausweichprojekt" habe, läuft es bei mir darauf hinaus, dass ich mir in Erinnerung rufe, dass es mein Job ist und dass ich mein Geld dafür bekomme xD
Der Gedanke an Geld motiviert mich ja immer extrem!
Außerdem ist da noch immer der Nebengedanke: "Umso schneller du das hier fertig hast, desto eher kannst du wieder ein interessanteres Projekt bearbeiten!"

so far
Karill

13.12.2011 - 10:40 Uhr

ich sehe Einen der passt, nämlich den Ersten
testdatei*.xls

in der Datenbank stehen, soweit ich das nun mitbekommen habe, die Dateinamen mit dem Wildcard

13.12.2011 - 10:09 Uhr

Ja!

Guck einfach mal unter
Extras -> Optionen
und dort im Fenster unter
Text-Editor -> C#

da findest du massig Einstellungsmöglichkeiten... auch die von dir Angesprochene ist dabei 😃
Formatierung -> Neue Zeilen
und dann Rechts
Zeilenwechseloptionen für geschweifte Klammern -> Öffnende geschweifte Klammern für Methoden in neuer Zeile platzieren

so far
Karill

12.12.2011 - 12:52 Uhr

wie das wohl kommt? 😄

Hm, lass mich mal raten: In den Firewalls ist der entsprechende Port des Protokolls gesperrt, der für den Ping genutzt wird?
Firewalls haben ihre Existenzgründe. Dazu gehört auch das Aussperren ungewollter Anfragen. Wenn nun das ARP-Protokoll geblockt ist, hat das sicher auch einen Grund 😉

Insofern wage ich sogar zu bezweifeln, dass man dieses Hinderniss (namens Firewall) selbst für einen einfachen Ping (zumindest auf legalem Weg) umgehen kann.

//EDIT:
Du könntest natürlich mit NMAP einen Portscan durchführen um vorweg nach einem offenen Port zu suchen und diesen dann in deinem Programm für eine Verbindungsabfrage hernehmen. Das kommt dem Ping dann wohl am nähesten, kann aber u.U. auch mehr Zeit in Anspruch nehmen (je nach verwendetem Protokoll).
(Beispielsweise ein Request auf Port 80)

so far
Karill

12.12.2011 - 09:06 Uhr

Hallo mscheitza,

danke für die Umsetzung einer Single-User und einer portablen Version, ich werde mir beide mal ansehen (und freue mich jetzt schon darauf).

Funktionieren sollte es zumindest noch in folgender Konstellation, wenn möglich:

  • Heim-Netzwerk mit mehreren Rechnern.

Dafür ist doch die CodeLibrary gedacht. Du kannst auf deinem "Server" mit dem CLDBInstaller den MySQL Server inkl. CodeLibrary Datenbank aufsetzen und dann von allen anderen Rechner im Netzwerk darauf zugreifen.

Entschuldige bitte den Denkfehler meinerseits. Das Problem, welches hier besteht ist, dass ich keinen wirklichen Server habe. Mal ist nur ein PC an, mal nur der Andere, mal beide zusammen.
Aber ich denke, mein Problem lässt sich am besten mit der portablen Version lösen... besonders, da einer der Rechner mein Laptop ist, den ich ja auch mit in die Schule nehme.

so far
Karill Endusa

30.11.2011 - 15:45 Uhr

Die von dir genannten Möglichkeiten setzten jedoch voraus, dass ein Teilnehmer als Server fungiert od. gar ein expliziter Server (als Vermittler) notwendig ist(...)

Hm, das hab ich nu natürlich leider nicht bedacht.
Mein Aufbau besteht aus einem Dienst und einer GUI dazu, und natürlich fungiert hier der Dienst gleichzeitig als Named Pipes Server.

@thetruedon:
Wenn du nicht möchtest, dass der Server (Client, welcher als Server fungiert) festgelegt werden muss, dann lass ihn doch dynamisch zuweisen.
Also nach dem Motto:

  • Programm wird gestartet
  • Programm sucht Server
    -- Server nicht gefunden -> Programm startet Thread mit Server-Funktionalität und fungiert so als Server
    -- oder: Server wird gefunden -> Verbinden

Das könnte man dann noch so erweitern, dass wenn der Server plötzlich "ausfällt" ein anderer Client zum Server wird und die Clients sich dann zu dem verbinden.

so far
Karill

30.11.2011 - 15:34 Uhr

Da du schon Pipes ansprichst:
Das Zauberwort hier heißt ganz klar IPC (Inter Process Communication)

Das geht über viele Wege, wie eben Named Pipes, TCP, UDP, .NET-Remoting und Einige mehr.

Was Named Pipes angeht, so hat mich folgende Seite am Weitesten gebracht:
dijksterhuis.org - Using Named Pipes in C#

so far
Karill

P.S.: Ich selbst hab mir .NET-Remoting noch nicht angeschaut, soll wohl aber noch besser sein 😃