Laden...

Objekt in mehreren Subklassen verwenden

Erstellt von Viper2000 vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.378 Views
V
Viper2000 Themenstarter:in
63 Beiträge seit 2008
vor 15 Jahren
Objekt in mehreren Subklassen verwenden

Guten Morgen...

ich muss nochmal eine Frage stellen:

Habe eine Basisklasse und mehrere davon abgeleitete Subklassen.
Alle Klassen dienen der Kommunikation mit einem USB Gerät über eine DLL die als Referenz eingebunden ist.

In der Basisklasse habe ich eine Variable dieser DLL erstellt und die Kommunikations-Methoden implementiert die von allen Subklassen mehrfach benötigt werden. Wenn ich nun allerdings aus einer Subklasse auf eine geerbte Methode der Basisklasse zugreifen will, bekomme ich folgenden Fehler:

Message "Die Quellklasse des verknüpften Objekts hat sich geändert. (Ausnahme von HRESULT: 0x80040008 (OLE_E_CLASSDIFF))" string

Ich verstehe nur nicht ganz warum? Die Variable der DLL müsste doch auch an die Subklassen vererbt werden. Aber bei jedem Zugriff auf eine dieser Funktionen schmier es mit obiger Fehlermeldung ab...

Hoffe einer kann helfen.

Gruß,
Viper

4.968 Beiträge seit 2008
vor 15 Jahren

Es scheint so, als ob die Klasseninstanz (der DLL) schon wieder gelöscht wurde (disposed).

Zeig doch mal etwas Source-Code...

V
Viper2000 Themenstarter:in
63 Beiträge seit 2008
vor 15 Jahren

Ok, zuerst die Basisklasse mit einer Beispielmethode (Den Namen der DLL habe ich mal auf XYZDll geändert und die Klasseninstanz ist: "Automation".


abstract class Test
    {
        protected XYZDll Automation;
        protected bool connected;
        protected Config config;

        public Test()
        {
            Automation = new XYZDll();
            connected = false;
        }

        public abstract void Start();

        protected void Connect()
        {
             Automation.Connect(true);
        }
    }

Dann eine ageleitete Klasse:


class RomTest : Test
    {        
        public RomTest(Config iConfig)
        {
            this.config = iConfig;            
        }

        public override void Start()
        {            
            Automation.PerformRomTest();
        }

Wenn ich un eine Instanz der Klasse RomTest erstelle und die Methode Start() anstoßen will dann crasht das Progamm.

V
Viper2000 Themenstarter:in
63 Beiträge seit 2008
vor 15 Jahren

hat noch jemand ne Idee?

4.968 Beiträge seit 2008
vor 15 Jahren

Evtl. hilft dir hierbei die GC.KeepAlive-Methode:


public Test()
{
     Automation = new XYZDll();
     GC.KeepAlive(Automation);

     connected = false;
}

5.942 Beiträge seit 2005
vor 15 Jahren

Hallo Viper2000

Der Fehler tritt auch auf, wenn du einfach mal ein Testprogramm schreibst ohne irgendwelche Klassen, oder?
Wenn ja, würde das die Frage vereinfachen, denn an der Vererbung liegt das bestimmt nicht 😉

Schau mal hier:

Hast du mehr Infos zu der DLL?

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011