Laden...

AccessViolationException bei Remoting mit Windows-.Net-Dienst/Konsolenanwendung

Erstellt von der Marcel vor 18 Jahren Letzter Beitrag vor 18 Jahren 5.545 Views
der Marcel Themenstarter:in
564 Beiträge seit 2006
vor 18 Jahren
AccessViolationException bei Remoting mit Windows-.Net-Dienst/Konsolenanwendung

Hallo Community!

Habe ein Remoting-Problem und möchte euch fragen, ob mir jemand von Euch helfen kann. Die Angelegenheit ist eigentlich sehr simpel: Ich habe einen Windows-Dienst geschrieben, welcher im Hintergrund Verwaltungsaufgaben erledigen soll. Um diesen Dienst mit einer GUI fernzusteuern habe ich per Remoting Kontakt zu der laufenden Instanz von der von ServiceBase abgeleiten Klasse im Dienst aufgenommen.

Im folgenden möchte ich meine Erklärungen mit etwas Code untersetzen:

//...............................................................................................................................................
//Bereitstellen der Klasse tempDeleteController
 //...............................................................................................................................................
TcpChannel myChannel = new TcpChannel(tempDelete.RemotingPort); //tempDelete ist von ServiceBase abgeleitet, enthält statisches Feld für den Port
ChannelServices.RegisterChannel(myChannel, true);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(tempDeleteController), "tempDeleteService", WellKnownObjectMode.Singleton);

Die bereitgestellte Klasse tempDeleteController stellt über eine Eigenschaft die Referenz auf die im Dienst laufende (Singleton-)Instanz von tempDelete (:ServiceBase) remote bereit.

//...............................................................................................................................................
//Die Klasse tempDeleteController für den Zugriff auf die im Dienst laufende Instanz von tempDelete
//...............................................................................................................................................
public class tempDeleteController: MarshalByRefObject
{
    public tempDeleteController()
    {
        serviceInstance = tempDelete.GetInstance(); //Bereitstellen der Referenz auf die Instanz von tempDelete
    }

    private tempDelete serviceInstance;

    public tempDelete ServiceInstance
    {
        get { return serviceInstance; }
        set { serviceInstance = value; }
    }
}

Nun zu meinem Client:
dieser baut die Remoting-Verbindung auf

//...............................................................................................................................................
//Aufbau der Verbindung
//...............................................................................................................................................
TcpChannel myClientChannel = new TcpChannel();
ChannelServices.RegisterChannel(myClientChannel, true);
RemotingConfiguration.RegisterWellKnownClientType(typeof(tempDeleteController), "tcp://Marcelnet:" + tempDelete.RemotingPort.ToString() + "/tempDeleteService");

erzeugt im Server eine Instanz von tempDeleteController und ruft eine Methode des Dienstes (tempDelete: ServiceBase) auf

tempDeleteController serviceControl = new tempDeleteController();
serviceControl.ServiceInstance.PerformCheck(); //!!Methode des Dienstes, das Ausführen dieser Zeile verursacht den Fehler!!

Damit wird die Methode PerformCheck auf dem Server (Dienst) synchron ausgeführt.
Das reguläre Beenden der GUI (Client) reißt den Dienst mit einer unbehandelten Win32-Ausnahme mit in die Tiefe. Genauere Informationen zu dem Fehler konnte ich noch nicht herausbekommen. Vielleicht hat jemand von Euch eine Idee, wie ich hier weiterkomme!

der Marcel

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

der Marcel Themenstarter:in
564 Beiträge seit 2006
vor 18 Jahren

Hi!

Habe den Sachnverhalt mit einer Konsolenanwendung statt Dienst nachprogrammiert. (remote-Zugriff auf ein laufendes Objekt über eine klasse, welche den Zugriff kapselt) Es kommt genauso an selber Stelle ein Fehler, diesmal aber eine (.Net)-AccessViolationException.
Hat jemand dazu eine Idee?

der Marcel

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

6.862 Beiträge seit 2003
vor 18 Jahren

Auf was wird denn der Zugriff verweigert? Kann sein das ne SecurityException dahinter steckt? Wenn dein Dienst mit Systemrechten läuft und du mit nem beschränkten User arbeitest, wäre es ja fatal wenn du über den Dienst alles steuern könntest. Denke da könnt nen Problem liegen - also an den jeweiligen Rechten.

Baka wa shinanakya naoranai.

Mein XING Profil.

der Marcel Themenstarter:in
564 Beiträge seit 2006
vor 18 Jahren

Hi talla!

Das ersehe ich aus dem Debugger leider nicht.

Details der AccessViolationException

System.AccessViolationException wurde nicht behandelt.
Message="Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist."
Source="System"
StackTrace:
bei System.Net.UnsafeNclNativeMethods.OSSOCK.WSAGetOverlappedResult(SafeCloseSocket socketHandle, IntPtr overlapped, UInt32& bytesTransferred, Boolean wait, IntPtr ignored)
bei System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
bei System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

Die MSDN meint zur AccessViolationException, dass diese nur bei unmanaged Code kommt, wenn ein Zeiger auf einen falschen Speicherbereich zeigt. Das wäre ein Indiz, dass es am Remoting selbst liegen könnte.
Der Dienst läuft mit System-Rechten und die GUI mit meinen Administrator-Rechten. Mit der Konsolenanwendung laufen Client und Server mit meinem Admin-Rechten.

Bis jetzt bin ich leider noch nicht so richtig schlau geworden 🤔

der Marcel

EDIT: und seltsamerweise kommt sie nicht beim Zugriff auf ein Objekt, sondern, wenn der Client regulär geschlossen wird.

EDIT2: Mittlerweile weiß ich sicher, dass meine AccessViolationException = Win32-Ausnahme ist! Die Win32 Ausnahme tritt auch mit der Konsolenanwendung auf, wenn man nicht debuggt.

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

der Marcel Themenstarter:in
564 Beiträge seit 2006
vor 18 Jahren

Hallo Community!

Ich konnte das Problem lösen. Es lag nicht an meinem Code, sondern an meinem Virenscanner (Nod32), welcher durch seine Arbeit den Fehler verursacht hat. Anscheinend macht ihm .Net2.0 an manchen Ecken und Kanten größere Probleme.
Danke an alle, die sich dem Thread angenommen haben! 🙂

der Marcel

EDIT: Für alle, die es genauer wissen möchten: Die Komponente IMON von Nod32 hat den Fehler verursacht. Wie es aussieht, scheint sie einen Bug zu haben. Der Ausschluss der Assemblies aus der Überwachung bringt nichts.

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

6.862 Beiträge seit 2003
vor 18 Jahren

Das ist ja allgemein ein Problem von Remoting. Es sieht für viele Virenscanner/Firewalls aus wie normale Netzwerkkommunikation und wird unter Umständen unterbunden. Wenns nur lokal ist, könntest doch auch nen IPC Channel benutzen, da dürfte das Problem nicht auftreten.

Baka wa shinanakya naoranai.

Mein XING Profil.

der Marcel Themenstarter:in
564 Beiträge seit 2006
vor 18 Jahren

Hi talla!

Danke für den Hinweis! Werde ihn umsetzen und euch informieren, ob Nod32 immernoch Probleme damit macht. Das Problem bei TCP ist nicht, dass er das als Angriff erkennt, sondern seine Prüfroutine Schwierigkeiten macht. Diese scheint Speicherbereiche des Programms geändert zu haben, wodurch es zu der Exception kam.

der Marcel

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

der Marcel Themenstarter:in
564 Beiträge seit 2006
vor 18 Jahren

Hi!

Mit IPC macht auch der Virenscanner keine Schwierigkeiten mehr, ist also besser 😉

der Marcel

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]