Also wenn du auf eine konkrete Instanz einer Klasse zugreifen willst, dann mußt du das als SAO veröffentlichen. (zumindest wenn ich dich richtig verstanden habe)
Hier ein paar Zeilen Code
Mensch peter = new Mensch("Peter");
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(Mensch),
"MyServer.rem",
WellKnownObjectMode.Singleton);
RemotingServices.Marshal(peter,"MyServer.rem");
ne, aber ne gute Idee. Werde ich machen. Aber loswerden muss ich diese Bindung ja trotzdem
Haha, jetzt mußte ich feststellen wenn die Main nicht als STAThread definiert ist, dann funktioniert die Klasse FolderBrowserDialog nicht mehr.
Da wird doch der Hund in der Pfanne verrückt.
Ich kapier nichts mehr...
das hatte ich eigentlich bedacht, nur beim Schließen hatte ich das vergessen.
Aber mit dem Schalter komme ich auch nicht recht weiter.
Bekomme ständig nicht nachvollziebare Threading Probleme.
Meistens beim Beenden der App. Obwohl ich vorher schön brav alle Threads beende.
Irgendwas stimmt da nicht...
Lasse ich das Attribute ganz weg, dann läufts. Zumindest bis jetzt ;-)
Was bewirkt das Attribute eigentlich beim Compiler ?
Also mit diesem Attribut scheine es kein Problem mit dem COM mehr zu geben.
Danke, und ich bin schon Stunden am Fehler suchen...
Jetzt hat sich aber ein neues Problem aufgetan.
Wird eine Form.Close() Methode von einem anderen Thread als Erzeuger geschlossen gibts ne Exception. Det war vorher noch nicht...
ich bin am Verzweifeln...
Ich benutze ein COM Object welches in einer c# Klasse gekapselt wird.
Jetzt habe ich das Problem das ich eine ExecutionEngineException bekomme wenn ich dieses Object zerstöre.
Wird ein Object vom Hauptthread der Anwendung erzeugt und dann freigegeben gibt es keine Exception.
Wird ein Object von einem anderen Thread erzeugt und zerstört wird, kommt eben diese Exception. Spätestens dann wenn die Anwendung beendet wird.
Ich vermute das ich bei dieser Methode Marshal.ReleaseComObject() den Fehler bekomme. Vermutung deshalb, denn bei mehreren Thread funktioniert das mit dem Debuggen nicht richtig.
danke für die Antwort.
Das Problem gestaltet sich doch etwas schwieriger. Mit normalen Files funktionert das mit dem neuen Prozess.
Ich möchte aber .lnk Files öffnen.
Das Programm soll Ziel-Objekte von Windowslinks (.lnk) kopieren.
Wenn sich eine Datei verschoben hat wird sie nicht mehr gefunden. Um die Links aufzulösen benutze ich eine fertige Klasse welche ein COM Object wrappt.
Nu lößt das Teil aber nicht alle fehlerhaften Links auf.
Ich habe bemerkt wenn man die .lnk Files trotzdem öffnet, findet Windows oft das Ziel und repariert die Links.
Deshalb soll das Programm zur Not diesen weg gehen und die .lnk Files direkt öffnen und wieder schließen.
Ich muss mal kucken ob ich den Prozess anhand des Filenames irgendwie im System finde. Ansonsten bleibt das File ja von dem Prozess belegt.
ich möchte ein File (.txt und .doc) öffnen. Das ganz in einem neuen Prozess.
Bei Prozess.Start() öffnet sich das Dokument. Nur dann habe ich kein Zugriff mehr.
D.h. die meisten Eigenschaften von Prozess bringen eine InvalidOperationException, genauso das Handle. Aber warum X(
System.Diagnostics.ProcessStartInfo pInfo = new System.Diagnostics.ProcessStartInfo("z.B.XYZ.doc");
pInfo.UseShellExecute = true;
Process p = new Process();
p.StartInfo = pInfo;
p.Start();
Thread.Sleep(500);
if(! p.HasExited )
{
p.CloseMainWindow();
p.Close();
}
Also sowas dämliches.
Ich habe die App.exe.config selber angelegt und zur Projektmappe hinzugefügt.
So gings nicht für Debugger.
Man muss "Hinzufügen" -> "Anwendungskonfiguration" und den Namen auf App.config belassen. Dann wird beim Compilieren automatisch diese Datei mit richtigen Namen in den Projektausgabe Ordner kopiert.
Irgendwie kommt dein Problem nicht ganz rüber.
In deiner Klasse DreiKon müßtest du noch Methoden zum hinzufügen und löschen von Dreiecke verpassen. Oder halt passende Operatoren überladen.
Im Prinzip könntest du 3 Klassen bauen.
Eine Klasse Dreick welche die Punkte speichert.
Eine Klasse DreieckCollection (denke mal das soll die DreiKon bei dir machen) welche 3Ecke speichert. Diese könntest du auch von "CollectionBase" ableiten. Das macht das ganze einfacher.
Eine Klasse welche Rechenoperationen für 3Eck Klassen bereitstellt.
meine Anwendung verwendet einige dlls. Diese habe ich in Unterordner aufgeteilt.
Damit die Anwendung die Dll's findet habe ich eine App.exe.config angelegt und entsprechend erweitert.
Das funktioniert auch.
Nur bekommt mein Comiler das irgendwie nicht gebacken. Der Compiler kopiert die Datei App.config nicht in den Ordner welcher unter "Debug" in den Konfigurationseigenschaften angegeben ist. Kopiere ich die selber rein, wird die Datei vom Compiler gelöscht. Der Debugger kennt sich dann aber nimmer aus weil er die ganzen Typen nicht findet.
Unter Verweise habe ich die Dlls direkt aus den Unterordnern referenziert.
Ich kann doch nicht immer eine lokale Kopie der Dlls ins Rootverzeichnis erstellen und beim Ausliefern die Dlls einsortieren.
ich habe ein Anwendung welche Crystal Reports verwendet und nen Bericht erstellt.
Was muss ich jetzt tun damit die Anwendung auch auf einen anderem PC läuft?
Benutze VS2003 und das CrystalReports Bundle (also nicht die Vollversion).
Also nach Anleitung erstelle ich ein Setup-Projekt, zeige auf die Applikation, pack die merge Module (Crystal_managed..., Crystal_regwiz..., Crystal_DataBaseAccess...) mit rein.
Im Modul Crystal_regwiz2003 gebe ich noch den Serial an, welche ich unter 'Hilfe' von VS2003 Entwicklungsumgebung finde.
Nun klappt der Setup auf dem Entwicklungsrechner, aber auf keinen anderen PC. Setup bricht ohne Fehlermeldung einfach ab.
Also dann gibt es keinen Ausweg das Programm Arbeitsverzeichnis mit Unterordner zu strukturieren.
Ich will auch nicht das Windows zu müllen in dem ich die Path Variable setzte.
ein Programm umfasst mittlerweile ne ganze menge Dateien auch DLLs. Diese würde ich gerne in Unterverzeichnisse aufteilen, z.B. eins für Plugins, eins für die Applikation selbst, noch noch weitere Unterordner.
Nu teilen sich aber z.B. Plugins Funktionalitäten aus anderen DLL's.
Wenn ich die jetzt in verschiedene Verzeichnisse aufteile denke ich mir das diese dann nicht mehr gefunden wird.
VS packt ja alles ins root Verzeichnis, da ist das kein Problem.
Gibts da nen Ausweg?
Kann man nen Pfad angeben wo DLLs gesucht werden?
Ich lege eine Session an und diese existiert für alle Seiten eines Webs.
Rufe ich habe eine andere Seite auf dem Webserver auf habe ich zwar die selbe SessionId aber die Session ist leer.
Wieso ist die auf einmal leer?
Problem ist folgendes.
Gibt ne Webanwendung welche alleine läuft. Diese wird aber auch in anderen Webanwendungen aufgerufen (in nem Iframe). Nu wäre es ganz praktisch wenn die existierende Session noch gültig wäre.
danke für die Links. Bin selber drauf gekommen.
Hab im Debugger einfach mal geschaut wie Container.DataItem aufgebaut ist.
Mit ein paar Casts funktioniert des dann auch. Ein ganz schönes Gefummel
Schade nur das keine Events übers Netz verschickt werden. Ich finde das dies eine praktische Sache wäre.
Ich wollte eigentlich nur nochmal dafür ein Beispiel geben. Das ist ja das was Pulpapex in seinem Post erwähnte.
Also es kann sehrwohl die Event-Klasse benutzt werden. Die nimmt ja einem viel Arbeit ab (An- u. Abmelden, sich alle Clients merken, dann in ner Schleife alle benachrichtigen usw)
Zitat
denn hier ist ja wieder ein Client-Objekt an ein Event des Server-Objektes genknüpft
Versteh ich jetzt nicht
Der Server muss in diesem Fall über keine Client-Informationen verfügen. Es ist wurscht welcher Client sich für das Ereignis interessiert.
Aber hast das Bsp. schon richtig verstanden. Ist so ne Art Repeater. Der fängt das Ereignis und gibt es wieder.
Wegen der Sicherheitseinstellungen einfach das vom 2. Post übernehmen.
Vielleicht darf ich auch noch eine Lösungsmöglichkeit vorschlagen welche auch die Veröffentlichung der Clientimplementierung umgeht.
Das ganze geht Richtung Event-Channel-Pattern.
Server will Client eine Event, Nachricht oder was auch immer schicken.
Dazu muss der Server irgendwas kennen wo er die Nachricht schicken kann.
Dazu erstellst du eine neue Klasse. Diese bietet ein Ereignis an welche vom Client aboniert werden kann. Damit Rechnergrenzen überwunden werden können muss diese Klasse von MarshalByRefObject erben. Damit alle Teilnehmer (Client u. Server) dieses Objekt kennen wird's in eine Bibliothek gepackt und steht beiden zu Verfügung.
Klasse könnte so aussehen:
public class CNameChangedListener : MarshalByRefObject
{
//hier registriert sich ein Client
public event NameChangedEventHandler NameChanged;
//das ruft der Server auf
public void OnNameChangedEvent(object sender, NameChangedEventArgs e)
{
if(NameChanged != null)
NameChanged(sender,e);
}
}
So schaut dann der Code auf Clientseite aus, hab mich mal auf deinen Code bezogen:
//der Einfachheit haben die EventHandler dieselbe Signatur, Namespace muss evtl. auch angepasst werden
//Object anlgen welches auch der Server kennt (Metainformationen)
nameChangedListener = new CNameChangedListener ();
//lokale Funktion registrieren
nameChangedListener.NameChanged += new RemoteObjects.NameChangedEventHandler(this.MethodeBeiClient);
//Object beim Server registrieren
iServer.NameChanged += new RemoteObjects.NameChangedEventHandler(nameChangedListener.OnNameChangedEvent);
vielleicht habe ich das schlecht erklärt. Denn das Problem wird immer größer.
Also so wie ich das sehe rufen viele Controls automatisch Validate() auf.
So wie z.B. Bearbeitungsbuttons vom Datagrid oder ein einfach LinkButton.
Bei vielen ist das ja sinnvoll.
So nun habe ich aber noch eigene Textfelder auf der Seite. Diesen habe ich einen Validator verpasst.
Leider werden die ja immer mit überprüft wenn Validate aufgerufen wird. (Und die sind ja dann leer wenn z.B. nur im Datagrid ein Eintrag bearbeitet wird)
Ich sehe den ausweg nur, kein Validator zu benutzen, und selber zu überprüfen wenn diese überprüft werden müssen.
Aber danke für den Tipp mit CausesValidation.
Dies kann ich bei einigen Controls in diesem Fall gebrauchen.
Meine Seite ist ein 2 Bereiche unterteilt.
Einmal ein DataGrid, wo man auch Daten bearbeiten kann.
Dann ist da noch ein Bereich wo man neue Daten hinzufügen kann.
Die Eingaben werden über Validator geprüft.
So wenn ich nun Daten im DataGrid bearbeite wird im Hintergrund auch die Methode 'Validate()' aufgerufen.
Tja leider überprüft der ja auch die Felder für Dateneingabe. Diese sollte ja zu diesem Zeitpunkt leer sein, bzw. nicht beachtet werden.