Question

J'ai un problème étrange dans mon projet. J'ai une classe qui hérite d'une classe de base (qui hérite à nouveau d'une autre classe de base) et remplace une fonction. Cependant, lorsque cette fonction est appelée, elle n’appelle jamais la fonction remplacée, mais la fonction de base.

Cependant, lorsque je remplace cette fonction dans la classe moyenne, elle est appelée. Mais ceci est déroutant: expliquons avec un dessin:)

  • lib GuiShared

    • classe bScreen
      • fonction virtuelle InitializeRoc
  • lib TigerControlRoot

    • classe bTigerScreen
      • fonction de substitution InitializeRoc < - lorsqu'elle est ignorée ici, elle est appelée
  • lib TigerControlRootCommonScreens
    • classe CheckInRules
      • fonction de remplacement InitializeRoc < - non appelée: s

Le constructeur se fait appeler cependant ...

Voici mon code (simplifié):

La classe de base partagée

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) { }
    }
}

classe de base du projet

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();
        }
    }
}

La classe en échec (ou toute autre classe de cette bibliothèque)

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);
        }
    }
}

Et si cela ne suffisait pas, lorsque j'essaie d'appeler une fonction de la classe de base, je reçois une TypeLoadException.

GenericArguments[0], 'TigerMiddleware.TigerRoc.Tiger', on 'Ppb.GuiShared.bMain`1+LoadEventArgs[T]' violates the constraint of type parameter 'T'.

Un code similaire avec la même librairie GuiShared est utilisé dans un autre projet et il n'y a pas de problèmes.

Était-ce utile?

La solution

D'accord, merci pour toutes les réponses, mais je les ai corrigées entre-temps.

Le problème était le suivant: La classe défaillante se trouve dans une dll à partir de laquelle son chemin de sortie en mode débogage est défini sur le dossier du plug-in de l'exécutable. Aucun problème jusqu'à présent, mais il copie également ses dépendances dans ce dossier.
Cependant, certaines des dépendances sont déjà copiées dans le dossier racine de l'exécutable. L’exécutable au démarrage recherche tous les plug-in du dossier des plug-ins et, au besoin, instancie le plug-in.
Le problème est alors que le plugin utilise les dépendances du dossier plugins tandis que le fichier exécutable utilise les dépendances du dossier racine qui sont fondamentalement le même fichier dans un répertoire différent. confond le clr:).

Ainsi, lorsque les dépendances partagées ne sont pas copiées dans le dossier plugins, tout fonctionne correctement car les plugins utilisent les dépendances du dossier racine et donc les mêmes dll.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top