2009-03-04 15 views
2

Ich habe ein seltsames Problem in meinem Projekt. Ich habe eine Klasse, die von einer Basisklasse (die wiederum von einer anderen Basisklasse erbt) erbt und eine Funktion überschreibt. Wenn diese Funktion aufgerufen wird, ruft sie jedoch nie die überschriebene Funktion auf, sondern die Basisfunktion.Overridden virtuelle Funktion nicht

Allerdings, wenn ich diese Funktion in der Mittelklasse zu überschreiben, wird es aufgerufen. Aber das ist verwirrend: Lassen Sie uns mit einer Zeichnung erklären :)

  • lib GuiShared

    • Klasse bEcran
      • virtuelle Funktion InitializeRoc
  • lib TigerControlRoot

    • Klasse bTigerScreen
      • Überbrückungsfunktion InitializeRoc < - wenn hier außer Kraft gesetzt es
  • lib TigerControlRootCommonScreens
    • Klasse CheckInRules
        aufgerufen wird
      • Überbrückungsfunktion InitializeRoc < - nicht aufgerufen: s

Der Konstruktor wird jedoch ...

meine (vereinfacht) Code hier genannt:

Die gemeinsame Basis Klasse

namespace Ppb.GuiShared.Screens { 
    public partial class bScreen<T> : Ppb.Controls.pPanel where T : FrameworkMiddleware.Framework.Remoting.Remotable, FrameworkMiddleware.IInitialize, new() { 
     public virtual void Load(bMain<T>.LoadEventArgs args) { 
      log.Trace("InitializeRoc " + this.GetType().FullName); 
      InitializeRoc(args); 
      _hasLoaded = true; 
     } 

     protected virtual void InitializeRoc(bMain<T>.LoadEventArgs args) { } 
    } 
} 

Projekt Basisklasse

namespace Tiger.ControlRoot.Screens { 
    public partial class bTigerScreen : Ppb.GuiShared.Screens.bScreen<roc.Tiger> { 
     public bTigerScreen(GuiSettings settings, roc.Tiger tiger) 
      : base(settings, tiger) { 
      InitializeComponent(); 
      InitializeMenu(); 
     } 
    } 
} 

die versagenden Klasse (oder eine andere Klasse von dieser lib)

namespace Tiger.ControlRoot.CommonScreens { 
    [ControlRoot.Screens.TigerScreenInfo("Testje", Tiger.ControlRoot.Screens.TigerScreenInfoAttribute.elevel.User, true)] 
    public class CheckInRules : ControlRoot.Screens.bTigerScreen { 

     public CheckInRules(GuiSettings settings, roc.Tiger tiger) 
      : base(settings, tiger) { 

     } 

     protected override void InitializeRoc(Ppb.GuiShared.bMain<TigerMiddleware.TigerRoc.Tiger>.LoadEventArgs args) { 
      base.InitializeRoc(args); 
     } 
    } 
} 

Und wenn das nicht genug wäre, wenn ich versuche, eine Funktion auf der Basisklasse I zu nennen Erhalte eine TypeLoadException.

Ähnliche Code mit der gleichen GuiShared-Lib wird in einem anderen Projekt verwendet und dort gibt es keine Probleme.

+0

Bitte geben Sie ein kurzes, aber vollständiges Programm an (vorzugsweise eine Konsolen-App), um das Problem zu demonstrieren. Die Schnipsel, die wir im Moment haben, sind nicht wirklich klar (jedenfalls für mich). –

+0

Können Sie uns die Definition von TigerMiddleware.TigerRoc.Tiger zeigen? –

Antwort

4

Okay, danke für alle (die) Antwort (en), aber ich habe es in der Zwischenzeit behoben.Das Problem war das folgende: Die fehlerhafte Klasse befindet sich in einer DLL, von der der Ausgabepfad im Debug-Modus auf den Plug-in-Ordner der ausführbaren Datei festgelegt ist. Kein Problem bis jetzt, aber es kopiert auch seine Abhängigkeiten in diesen Ordner.
Einige der Abhängigkeiten wurden jedoch bereits in den Stammordner der Programmdatei kopiert. Die ausführbare Datei sucht beim Start alle Plugins im Plugin-Ordner und instanziiert das Plugin bei Bedarf.
Das Problem ist dann, dass das Plugin die Abhängigkeiten aus dem Ordner plugins verwendet, während die ausführbare Datei die Abhängigkeiten aus dem Stammordner verwendet, die im Grunde die gleiche Datei in einem anderen Verzeichnis sind. Während der Clr sieht sie als 2 verschiedene DLLs und das verwirrt wirklich die clr :).

Wenn also die gemeinsamen Abhängigkeiten nicht in den Plugins-Ordner kopiert werden, läuft alles gut, weil die Plugins die Abhängigkeiten vom Root-Ordner und damit die gleichen DLLs verwenden.

+0

Sie sollten wahrscheinlich Ihre eigene Antwort akzeptieren, damit diese nicht mehr als "unbeantwortet" angezeigt wird. – oefe

+0

@oefe Ich versuchte es, aber ich musste 48 Stunden warten :) – Stormenet