3

我的项目中有一个奇怪的问题。我有一个从基类继承的类(它又从另一个基类继承)并覆盖了一个函数。但是,当调用该函数时,它永远不会调用被覆盖的函数,而是调用基函数。

但是,当我在中间类中覆盖该函数时,它会被调用。但这很令人困惑:让我们用一张图来解释:)

  • lib GuiShared

    • b级屏幕
      • 虚函数 InitializeRoc
  • 库 TigerControlRoot

    • bTigerScreen 类
      • 覆盖函数 InitializeRoc <-- 当在这里被覆盖时,它被调用
  • lib TigerControlRootCommonScreens
    • 类 CheckInRules
      • 覆盖函数 InitializeRoc <-- 未调用:s

然而,构造函数被调用......

这是我的(简化的)代码:

共享基类

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

项目基类

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

失败的类(或该库中的任何其他类)

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

如果这还不够,当我尝试调用基类上的某个函数时,我会收到 TypeLoadException。

GenericArguments[0], 'TigerMiddleware.TigerRoc.Tiger', on 'Ppb.GuiShared.bMain`1+LoadEventArgs[T]' 违反了类型参数 'T' 的约束。

在另一个项目中使用了具有相同 GuiShared 库的类似代码,没有问题。

4

1 回答 1

4

好的,感谢所有(这些)响应,但我同时修复了它。

问题如下:失败的类在一个 dll 中,它在调试模式下的输出路径设置为可执行文件的插件文件夹。到目前为止没问题,但它也会将其依赖项复制到该文件夹​​中。
但是,一些依赖项已经复制到可执行文件的根文件夹中。可执行文件在启动时搜索插件文件夹中的所有插件,并在需要时实例化插件。
那么问题是插件使用插件文件夹中的依赖项,而可执行文件使用根文件夹中的依赖项,这些依赖项基本上是不同目录中的相同文件,因此在运行 clr 时将它们视为 2 个不同的 dll,这真的混淆了 clr :)。

因此,当共享依赖项未复制到插件文件夹时,一切运行正常,因为插件使用根文件夹中的依赖项,因此使用相同的 dll。

于 2009-03-04T11:49:41.967 回答