Laden...
P
Pulpapex myCSharp.de - Member
Java-Entwickler Rostock Dabei seit 22.07.2003 939 Beiträge
Benutzerbeschreibung

Forenbeiträge von Pulpapex Ingesamt 939 Beiträge

10.05.2005 - 13:54 Uhr

Ok, Threading/Asynchroner Methodenaufruf

Ausgangspunkt, ohne Threads:

TraceFilter traceFilter = new TraceFilter(FilterType.WhiteBox, 100);
picTrace.Image = traceFilter.Filter(new Bitmap(@"C\\:Model.jpg"));

Asynchrone Filterung:

TraceFilter traceFilter = new TraceFilter(FilterType.WhiteBox, 100);
traceFilter.AsyncFilter(new Bitmap(@"C\\:Model.jpg"));

while (traceFilter.Progress < 100)
{
   pBar.Value = traceFilter.Progress;
}

picTrace.Image = traceFilter.FilteredBitmap;

Und so ist die asynchrone Filterung implementiert (sind bestimmt noch Syntaxfehler drin):

// Enthält das gefilterte Bild
public Bitmap FilteredBitmap {get; set;}

// Normale Filter-Methode ohne Threading.
public Bitmap Filter(Bitmap b) {
   // ...
}

// Asynchrone Filter-Methode mit Threading.
// Das Ergebnis kann in der FilteredBitmap-Eigenschaft abgefragt werden.
public IAsyncResult AsyncFilter(Bitmap b) {
   AsyncCallback callback = new AsyncCallback(HandleFilterCallback);
   FilterMethod filter = new FilterMethod(Filter);
   object asyncState = filter;
   IAsyncResult ar = filter.BeginInvoke(b, callback, asyncState);
   return ar;
}

// Callback, wenn die Filterung vorüber ist.
private void HandleFilterCallback(IAsyncResult ar) {
   FilterMethod filter = (FilterMethod)ar.AsyncState;
   FilteredBitmap = filter.EndInvoke(ar);
}

// Delegate für die Filter-Methode.
private delegate void FilterMethod(Bitmap b);

Gruss
Pulpapex

10.05.2005 - 13:41 Uhr

Ich weiss ja nicht was TraceFilter für eine Klasse ist. Wenn es deine eigene ist, müsstest du sie um eine Progress-Eigenschaft erweitern, wo man den Filterfortschritt abfragen kann. Und ja, das läuft dann mit Threads. Wenn es nicht deine Klasse ist, weiss ich nicht was man machen kann.

Noch was anderes: wird die Filterung etwa im TraceFilter-Konstruktor durchgeführt? Das wäre meiner Meinung nach kein gutes Klassendesign. Im Konstruktor soll nur erzeugt und eingestellt werden. Die Filterung beim Abfragen der FilteredBitmap-Eigenschaft zu starten, ist genauso ungünstig. Langwierige Aktionen sollten über Methoden angestoßen werden.

So in etwa:

TraceFilter traceFilter = new TraceFilter(FilterType.WhiteBox, 100);
picTrace.Image = traceFilter.Filter(new Bitmap(@"C\\:Model.jpg"));
10.05.2005 - 13:15 Uhr

Hi Fatal,

du musst anders herangehen. Nicht der Filter aktualisiert den Fortschrittsbalken, sondern die GUI-Anwendung fragt den Fortschritt beim Filter ab und aktualisiert sich selbst.

Die Abfrage des Filter-Fortschrittes kann entweder ereignisgesteuert oder periodisch durch Polling erfolgen. Diese Herangehensweise hat auch den Vorteil, dass die Dll unabhängig bleibt. Sie braucht nur die eigene Assembly und kann dadurch in anderen Projekten wiederverwendet werden.

Gruss
Pulpapex

09.05.2005 - 17:26 Uhr

Hi kaybe,

analog zu KeyDown und KeyUp gibt es auch die Ereignisse MouseDown und MouseUp.

Habe sowas für die Maus noch nicht gefunden.

da hast du wohl nicht richtig gesucht. 😉

Gruss
Pulpapex

09.05.2005 - 16:55 Uhr

Hi 53,

richTextBox1.SelectedText liefert einen String zurück und Strings sind unveränderlich. Die Replace-Methode ändert deshalb nicht die Eigenschaft, sondern liefert nur einen String mit dem geänderten Text zurück.

Also so sollte es dann gehen:

string text = richTextBox1.SelectedText;
string replaced = text.Replace("intZAHL", Convert.ToString(i+j));
richTextBox1.SelectedText = replaced;

Gruss
Pulpapex

09.05.2005 - 13:32 Uhr

Warum kann das aber nicht sein?

Ohne Code wird man dir nicht weiter helfen können. Zeig' doch mal das Umfeld Codezeile, die im Stacktrace angegeben ist.

Gruss
Pulpapex

07.05.2005 - 18:56 Uhr

Ich hab gedacht, du wolltest den Text in der RichTextBox formatieren, so dass es passt. Also mit MeasureString nur die Textbreite im Pixel messen, aber nicht im Control zeichnen.

Wenn du selbst zeichnen möchtest, musst du RichTextBox.OnPaint überschreiben. Die Ansicht muss bei einem Control ständig aktualisiert werden. Wenn nicht, verschwindet das Gezeichnete wie du selbst bemerkt hast.

Gruss
Pulpapex

06.05.2005 - 22:47 Uhr

Vielleicht liegt es auch daran, dass Menulib.menue gar nicht von MenuStrip ableitet. Wen dem so ist, muss die Klasse wenigstens ein MenuStrip per Eigenschaft veröffentlichen.

// menue-Klasse aus der DLL instanziieren.
menue m = new menue();

// MenuStrip bei der Form setzen.
this.MainMenuStrip = m.MenuStrip1;

Wenn das auch nicht der Fall ist, kannst du die DLL vergessen.

06.05.2005 - 22:42 Uhr

Hi Snowm,

hier zwei Threads ausm Board:

Scanner abfangen
MessageFilter - Wert an Formular übergeben

Die sollten dir schon ein wenig weiterhelfen. Ansonsten frag die Leute, die sowas schon programmiert haben. Vielleicht können sie dir mehr Code zeigen.

Gruss
Pulpapex

06.05.2005 - 22:31 Uhr

Hmm, ich glaub ich red undeutlich. Noch ein letztes Mal: die DLL mit dem Menü muss im "Solution Explorer" unter "References" hinzugefügt werden. Dann stehen die in der DLL definierten Klassen, in dem Fall die Menuelib.menue-Klasse, in deinem Projekt zu Verfügung und können im Code verwendet werden.

06.05.2005 - 22:18 Uhr

Mit nem Regex geht es noch einfacher, der Test auf != "" fällt weg.

string text = "abcd    123         hgf45    234";
string[] s = Regex.Split("\\\\s+", text);

// s.Length == 4
for(int i = 0; i < s.Length; i++)
{
}
06.05.2005 - 22:08 Uhr

Ich weiss nicht was du mit "dynamisch" meinst. Wenn du das Menü ohne den Designer hinzufügen möchtest, wie gehabt die Referenz zum Projekt hinzufügen und in der Form deiner Anwendung folgenden Code einfügen:

public class MainForm : Form {

   public MainForm() {

      InitializeComponent();

      // Diesen Code einfügen.
      // die menue-Klasse sollte von MenuStrip abgeleitet sein.
      this.MainMenuStrip = new menue();
   }
}
06.05.2005 - 20:14 Uhr

Hi juhuichbins,

du kannst mit Graphics.MeasureString die Ausmaße von Text mit Angabe der Schriftart bestimmen. Mit Graphics.FromHwnd bekommst du das Graphics-Objekt der RichTextBox. Am besten einen using-Block verwenden, damit das Graphics-Objekt in jedem Fall wieder freigegeben wird.

using(Graphics g = Graphics.FromHwnd(rtb.Handle) {
   int textWidth = g.MeasureString(/* .. */);
}

Gruss
Pulpapex

06.05.2005 - 19:59 Uhr

Hi Fab84,

in VC# 2005 Beta2 gibt es im Menü den Punkt "Tools/Choose Toolbox Items ...". Im sich öffnenden Dialog kann über die Browse-Schaltfläche eine Dll aus dem Dateisystem zur Liste der verfügbaren Controls hinzugefügt werden. Dann noch die Checkbox mit dem Control markieren und der MenuStrip sollte in der Designer-Toolbox erscheinen.

Nicht vergessen, dass die Dll zum Compilieren auch im Projekt eingebunden sein muss (der Compiler muss die Dll finden). Dazu die besagte Dll im Solution Explorer unter "References" hinzufügen. Nur sicherheitshalber, ich weiss nicht ob der Designer das auch automatisch macht.

Gruss
Pulpapex

PS: verschoben nach "Integrierte Entwicklungsumgebungen"

06.05.2005 - 14:28 Uhr

Ist klar, wenn das HeaderPanel vor dem eigentlichen Zeichnen mit einer Farbe gelöscht wird, bleibt diese Farbe im nicht gezeichneten Bereich der runden Ecken stehen. Die Codezeile muss also raus. Das hilft aber erstmal noch nicht viel, da sich ein Control ohnehin bei jedem Repaint selbsttätig in der Hintergrundfarbe löscht.

Füge mal folgende Zeile im Konstruktor von HeaderPanel ein:

SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint);

Die Styles verhindern das Löschen, die im Hintergrund liegenden Controls sollten dadurch durchscheinen.

Ansonsten hilft dir auch einer der vielen CodeProject-Artikel zum Thema "XP-Style Explorer Panel" weiter.
Z.B. der hier: Full-featured XP Style Collapsible Panel

Gruss
Pulpapex

06.05.2005 - 11:00 Uhr

hi BruderKotlett,

kennst du schon www.imdb.com - International Movie Database? Es gibt eine Websuche auf der Seite. Ob es allerdings eine Programmierschnittstelle gibt, kann ich nicht sagen. Musst du mal selbst gucken.

Gruss
Pulpapex

06.05.2005 - 10:55 Uhr

Hi -acid-,

das sind gute Ratschläge, die jeder im Hinterkopf behalten sollte.

Da wird schon beim "gute Ratschläge geben" sind, du solltest daran arbeiten, deine Fragen verständlicher zu formulieren. Wenn niemand antwortet, könnte es daran liegen, dass keiner versteht was du eigentlich willst.

Beispiel: Problem mit Hintergrundfarbe in Panel

Gruss
Pulpapex

06.05.2005 - 09:28 Uhr

Ist im im Stacktrace zu sehen wo der Fehler auftritt. Die Exception wird von Port.Open ausgelöst. Die erste einsehbare Codeposition ist GPSConn.open, oder? Die Methode wird von ComTester.changeToPort aufgerufen, die wiederum durch einen Button-Click aktiviert wird.

Könnte es vielleicht sein, dass die Com-Ports auf den anderen Rechnern im Bios deaktiviert sind? Der Com-Port 2 könnte auch schon offen und in Verwendung sein, z.B. durch eine Uralt-Maus.

04.05.2005 - 22:02 Uhr

Du fragst ja schon wieder das selbe!

Auf Objekte wird in .Net nur über Verweise zugegriffen (Verweistypen).

Die Betonung liegt auf "nur".

Es ist in der Tat sogar mit Aufwand verbunden, wenn eine Kopie von einem Objekt erzeugt werden soll. Die Klasse muss dafür ICloneable implementieren. Dann kann mit

object var2 = obj.Clone();

statt ein Verweis auf obj, ein Verweis auf eine Kopie von obj in der Variablen var2 gespeichert werden.

04.05.2005 - 16:13 Uhr

Hi phunkydizco,

Auf Objekte wird in .Net nur über Verweise zugegriffen (Verweistypen). Helper ist also keine neue Instanz, sondern nur ein Verweis auf eine schon bestehende Instanz. Dabei wird kaum Speicher verbraucht.

Es gibt dann noch die Wertetypen (struct, enum). Bei Wertetypen wird bei einer Zuweisung eine Kopie erstellt.

Gruss
Pulpapex

04.05.2005 - 16:02 Uhr

Das heisst der Konstruktor ist schon definiert. Der dateiLesen-Aufruf muss in den schon definierten Konstruktor mit rein. Der zweite Konstruktor kann wieder gelöscht werden.

04.05.2005 - 15:52 Uhr

Hi kiwi_girl,

Beim Erzeugen der Form wird zuerst der Konstruktor aufgerufen, da kannst du den dateiLesen-Aufruf mit reinsetzen.

static void Main() {
   Application.Run(new frmSms());
}

// Konstruktor
public frmSms() {

   // [..]

   dateiLesen();
}

private void dateiLesen() {
   // ...
}

Gruss
Pulpapex

04.05.2005 - 12:38 Uhr

Das wird daran liegen, dass du Bildvektor jedes Mal wieder mit new Point(0, 0) initialisierst. Der Vektor muss als Membervariable in der Klasse vorgehalten werden, da aus der letzten Bildposition und der aktuellen Mausposition die neue Bildposition ermittelt wird.

04.05.2005 - 11:36 Uhr

Hi rs4,

die Mauskoordinaten müssen noch in Image-Koordinaten umgerechnet werden. Das Ganze ist einfache Vektorarithmetik im Control-Koordinatensystem. Es gibt drei Vektoren: Center-Vektor (Control-Mittelpunkt), Mouse-Vektor (Mausposition) und Image-Vektor (Bildposition). Mouse-Vektor minus Center-Vektor ergibt einen Verschiebungsvektor. Dieser muss zum aktuellen Image-Vektor addiert werden, das ergibt die neue Bildposition.

Ich habe mal schnell eine Grafik gebastelt, die das veranschaulicht.

Gruss
Pulpapex

03.05.2005 - 11:10 Uhr

Hi korrupt,

wahrscheinlich ist auf dem Zielrechner keine .Net-Laufzeitumgebung installiert. Schau mal in die FAQ hier im Board.

Gruss
Pulpapex

02.05.2005 - 22:59 Uhr

Ich habe eine WaveFileStream-Klasse geschrieben, die kann man auch nur zum Lesen des Wave-Headers verwenden. Im Konstruktor übergibt man einen System.IO.Stream, danach stehen die Header-Informationen in der Header-Eigenschaft zur Verfügung.

Stream fileStream = File.OpenRead("sound.wav");
WaveFileStream waveStream = new WaveFileStream(fileStream);
WaveHeader h = waveStream.Header;
waveStream.Close();

WaveHeader hat eine Format-Eigenschaft, über die man die oben angegebenen Daten-Bytes abfragen kann.

Eine Zip-Datei mit den cs-Dateien und der Assembly habe ich angehängt. Wahrscheinlich ist die Assembly mit VC# Beta 1 kompiliert. Zur Not nochmal neu kompilieren.

Gruss
Pulpapex

02.05.2005 - 22:36 Uhr

Hi Maddinel,

du musst im Wave-Header den Format-Chunk auslesen. Der Format-Chunk beginnt mit der Zeichenkette "fmt ". Dann folgen die Daten-Bytes:

formatTag : 2 Byte
channels : 2 Byte
samplesPerSec : 4 Byte
avgBytesPerSec : 4 Byte
blockAlign : 2 Byte
bitsPerSample : 2 Byte

Die Spiellänge in Sekunden ergibt sich damit aus:

Dateilänge / samplePerSec * bitsPerSample / 8

Da würde ich aber nochmal nachgooglen, blockAlign muss glaube ich auch noch in die Formel rein.

Gruss
Pulpapex

02.05.2005 - 16:16 Uhr

Auf den zweiten Blick sehe ich jetzt im StackTrace, dass der Fehler auf Serverseite auftritt (der StackTrace ganz oben, danach folgt der StackTrace auf Clientseite). Der Client ruft GetApplications auf. Auf Serverseite soll dann für den Aufruf das registrierte Serviceobjekt geladen und instanziiert werden. Und der Type wird wohl nicht gefunden.

Also das registrierte Serviceobjekt oder ein anderer, verwendeter Type kann auf Serverseite nicht geladen werden. Assembly Programdetector.dll wird nicht gefunden, glaube ich.

Hast du die Projekt-Referenzen zwischen Client- und Server-Projekt schon entfernt?

Gruss
Pulpapex

02.05.2005 - 15:47 Uhr

Dann musst du es wohl so machen:

Im Programm gibt es ein grosses Original-Image, in der PictureBox befindet sich nur ein kleineres Arbeits-Image mit dem Bildausschnitt. Bei einem Mausklick ins Bild wird dann aus dem Original-Image der aktuelle Ausschnitt ins Arbeits-Image kopiert. In das Arbeits-Image kann man mit Graphics.FromImage(workingImage) zeichnen. Dran denken, dass das gelieferte Graphics-Objekt unbedingt und so schnell wie möglich mit Dispose wieder freigegeben werden muss (using()-Block).

Gruss
Pulpapex

02.05.2005 - 15:40 Uhr

Hast du Scrollbalken? Wenn ja, könntest du die SetDisplayRectLocation-Methode des ScrollableControls (oder einer ScrollableControl-Ableitung), das die Scrollbalken bereitstellt, verwenden.

Ich weiss nicht genau wie die PictureBox-Klasse ihre Scrollbalken bekommt. Von ScrollableControl ableiten, tut sie jedenfalls nicht. Also vermute ich, dass sie in ein ScrollableControl eingebettet ist.

Gruss
Pulpapex

02.05.2005 - 15:27 Uhr

Die System.Windows-Controls sind sauber programmiert. 😉

So ähnlich dürfte die SelectedIndex-Eigenschaft aussehen. D.h. das SelectedIndexChanged-Ereignis wird nur ausgelöst, wenn sich der Wert auch wirklich geändert hat:

public int SelectedIndex {
   get { return selectedIndex; }
   set {
      if(selectedIndex != value) {
         selectedIndex = value;
         OnSelectedIndexChanged(EventArgs.Empty);
      }
   }
}

Gruss
Pulpapex

02.05.2005 - 14:45 Uhr

Was ist denn an deiner TextBox anders, dass TextBox oder RichTextBox als Grundlage nicht verwendbar sind? Vielleicht bringen uns ein paar Hintergrundinformationen weiter: wie soll deine TextBox aussehen, was soll sie können, wofür soll sie da sein usw.

Gruss
Pulpapex

02.05.2005 - 14:33 Uhr

Wahrscheinlich verwendest du immer noch Typen, die auf Clientseite nicht vorhanden sind. Welche Typen liefert der Aufruf von RIS.ProgramDetector.Interfaces.IProgDetector.GetApplications zurück oder in welchen Typ castest du? Poste mal den Code der ResxProgrammanager.crtlProgramresxHandler.FillGrid-Methode.

Nochmal: alle Interfaces und alle Parameter und Rückgabetypen der Interfaces müssen sich in einer Assembly befinden, die beim Client und beim Server lokal verfügbar ist. Am besten legst du dir eine Solution/Combine mit drei Projekten an: Client, Interfaces, Server. Client und Server haben Referenzen/Verweise auf das Interfaces-Projekt, es darf aber keine Projekt-Referenzen direkt zwischen Client und Server geben.

Gruss
Pulpapex

02.05.2005 - 09:51 Uhr

Warum leitest du nicht von TextBoxBase ab? Die Klasse implementiert einige Basisfunktionalitäten für "text-manipulierende Controls". Dazu gehört wie es aussieht auch die Caret-Darstellung.

Gruss
Pulpapex

01.05.2005 - 04:51 Uhr

Für spezielle Tasten wie Esc oder die Cursortasten muss IsInputKey oder IsInputChar überschrieben werden.

Schau dir die Doku zu den Methoden an.

Gruss
Pulpapex

// Edit: bin ich doch glatt drauf reingefallen. Programmierhans, kramst du in alten Postings rum? Naja, ich glaube es liegt am IsInputKey.

29.04.2005 - 22:24 Uhr

Da scheint mir generell irgendwas kaputt zu sein. Hat herbivore schon gefragt, auf welcher Control-Klasse zeichnest du denn?

29.04.2005 - 20:46 Uhr

Hast du trotzdem mal eine andere Farbe versucht? Was soll der Aufruf denn bewirken? Soll das Control durchsichtig werden?

Gruss
Pulpapex

29.04.2005 - 20:35 Uhr

Hi MartinE, hast du dir mal den Startbeitrag durchgelesen? 😉

Konnte mir das nicht verkneifen,
schönes WE.

29.04.2005 - 18:25 Uhr

Könnte auch ein Threadproblem sein, aber das sind alles nur Vermutungen. Ich befürchte den Fehler musst du alleine rausfinden, Rapthor.

@svenson
Über die Name-Eigenschaft ändert man im Designer doch die Benennung der Membervariablen. Ist die Membervariable z.B. als this.textBox1 deklariert und man ändert im Designer die Name-Eigenschaft in sagen wir "loginTextBox", ändert sich auch die Membervariable in this.loginTextBox. Ist klar, dass Leerzeichen da Probleme machen würden.

Wenn man ohne visuellen Designer arbeitet, hat die Name-Eigenschaft meiner Meinung nach keine Bedeutung, deshalb kann man angeben was man möchte.

29.04.2005 - 17:45 Uhr

Ich glaube Threads aus dem ThreadPool sind schneller. Und zwar werden in diesem doch Betriebssystem-Threads zur Wiederverwendung vorgehalten. Ich dachte der ThreadPool dient gerade zur Ressourcen- und Geschwindigkeitsoptimierung.

AsyncCallback ist keine Klasse, sondern nur ein Delegat, die Callback-Methode, die aufgerufen wird, wenn der Thread beendet wird. In der Doku steht explizit, dass EndInvoke aufgerufen werden muss, um Ressourcen wieder freizugeben. (.. hab aber keine Lust, das jetzt noch rauszusuchen .. geht ab nach hause 😉 )

Gruss
Pulpapex

29.04.2005 - 16:12 Uhr

Wenn das selbst programmierte Ereignisse sind, kann man die OnEvent-Methode so programmieren, dass das Ereignis asynchron ausgelöst wird.

Habe ich zwar noch nie gemacht, aber so ungefähr müsste es funktionieren:

// EventA asynchron auslösen.
protected void OnEventA() {

   if(EventA != null) {
      AsyncCallback callback = new AsyncCallback(HandleEventACallback);
      EventA.BeginInvoke(this, EventArgs.Empty, callback, EventA);
   }
}

// Asynchronen Vorgang ordentlich abschliessen.
private void HandleEventACallback(IAsyncResult ar) {

   // Verwendeten Thread beenden/in den ThreadPool freigeben.
   EventHandler eventA = (EventHandler)ar.AsyncState;
   eventA.EndInvoke(ar);
}

public event EventHandler EventA;

Gruss
Pulpapex

29.04.2005 - 13:44 Uhr

Das Einstellungsfenster muss als modaler Dialog geöffnet werden, ein normales Fenster, kein Mdi-Form. Das geht mit Form.ShowDialog. Als Parameter wird das owner-Fenster angegeben, das solange der Dialog offen ist, blockiert werden soll.

Gruss
Pulpapex

29.04.2005 - 12:24 Uhr

Der Wert, der bei der Name-Eigenschaft gesetzt wird, ist Unsinn. Wenn du ohne visuellen Designer arbeitest, kannst du die Name-Eigenschaft getrost ignorieren, braucht man nicht.

Das wird aber nicht der Fehler sein. Hast du beim Control irgendwelche EventHandlers registriert? Ich vermute, du hast irgendwie ne Endlosschleife konstruiert, in der sich Events immer hin und her gegenseitig auslösen.

Kann natürlich auch ne ganz andere Ursache haben. Aus dem angegebenen Code ist die Ursache jedenfalls nicht ersichtlich.

Gruss
Pulpapex

29.04.2005 - 08:51 Uhr

Ich hab nachgeschaut wie ich mal Arrays gemarshalt hatte. Es hatte ausgereicht [In, Out] anzugeben. Das Array als out-Parameter anzugeben, ging glaube ich nicht. Wahrscheinlich rät hier der Marshaller in welchen C-Typ genau umgewandelt wird, also ist MarshalAs schon ok. text und key würde ich im ersten Anlauf versuchen als string-Parameter zu übergeben, eigentlich sollen es ja Strings sein. Falls es nicht klappt, kann man es erst auch mit MarshalAs versuchen, bevor man einen anderen Typ probiert.

[DllImport("encodeLib.dll")]
private static extern void AuthEncode(
   string text,
   int textLen,
   string key,
   int keyLen,
   [Out] byte[] digest);
28.04.2005 - 18:47 Uhr

Soll die Funktion in einer .Net-Dll bereitgestellt/veröffentlicht werden oder gibt es sie schon und du möchtest sie in deinem .Net-Programm verwenden?

Ersteres geht nicht, da zum Ausführen von .Net-Code die .Net-Runtime laufen müsste. Das ist nicht gegeben, wenn von C/C++ aus eine Funktion in einer Dll aufgerufen wird. Man kann .Net-Dlls nur als CCW (Com Callable Wrapper) von ungemanagten Code aufrufen lassen, also COM-Programmierung.

Um eine bestehende C/C++ Funktion in .Net zu verwenden, versuche mal folgendes (wird zwar nicht auf Anhieb funktionieren, aber die Fehlermeldung hilft dir vielleicht weiter):

[DllImport("encodeLib.dll")]
private static extern void AuthEncode(
   string text, 
   int textLen, 
   string key, 
   int keyLen, 
   out byte[] digest);

Msdn:
Zusammenarbeit mit nicht verwaltetem Code
Lernprogramm P/Invoke

Gruss
Pulpapex

28.04.2005 - 17:04 Uhr

Wie gesagt einfach mal im Board suchen.

Der Thread hier ist glaube ich ganz informativ (wenn du den von herbivore durch hast):
Remote-Event Fehlermeldung

Es geht darum, dass die Client-Anwendung nicht den kompletten Codebestand der Server-Anwendung lokal haben muss. Kann man so lösen, indem der Client nicht direkt auf die Server-Klassen zugreift, sondern nur über Server-Interfaces. Dadurch müssen clientseitig nur die Server-Interfaces verfügbar sein, aber nicht die Klassen.

Gruss
Pulpapex

28.04.2005 - 16:55 Uhr

Ja, aber da braucht man eine spezielle Bibliothek dafür. Die muss mit der Anwendung mitgeliefert werden.

Wenn man nur ein kleines Programm schreiben möchte, das Mp3s abspielen können soll, ist es doch schön, wenn man mit Boardmitteln auskommen kann, auch wenn die Funktionen sehr rudimentär sind. Besonders, wenn es so einfach ist.

Für komplexere Geschichten ist eine fertige Bibliothek besser geeignet, keine Frage.

Gruss
Pulpapex

28.04.2005 - 14:16 Uhr

Die Cursorposition wird über die Selektion festgelegt.

textBox.SelectionStart = newCursorPosition;
textBox.SelectionLength = 0;

// Oder
textBox.Select(newCursorPosition, 0);

Gruss
Pulpapex

28.04.2005 - 13:00 Uhr

Ein Client benötigt eine Dll mit den Server-Typen, die er verwendet. Anders herum verhält es sich genauso, der Server benötigt eine Dll mit den Client-Typen.

Am besten du legst dir eine Dll mit Interface-Typen für Client und Server an. Die Dll wird sowohl dem Client als auch dem Server mitgegeben. Selbst definierte Parameter-Typen, die in den Interfaces verwendet werden, gehören auch in diese Dll. Dann sollte es wieder funktionieren.

Ansonsten lies dir auch mal die Beiträge zu Remoting hier im Board durch. Es war schon häufiger Thema und es wurden gute Tipps gegeben.

Gruss
Pulpapex

27.04.2005 - 23:03 Uhr

hi maxE,

das sind schön einfache Beispiele, nur leider nur für VB und C++. Wäre ein gutes Thema für einen Artikel hier im Board. Wie man einfach Sound abspielen kann, sowas kann man immer brauchen.

Wenn du Lust dazu hast, da was zu schreiben, wende dich an Alexander, der trägt dich als Autor ein.

Gruss
Pulpapex