我的项目中有一个奇怪的问题。我有一个继承自基类的类(它再次从另一个基类继承)并覆盖一个函数。但是,当调用该函数时,它从不调用重写函数,而是调用基函数。
但是,当我在中间类中覆盖该函数时,它被调用。但这很令人困惑:让我们用图纸来解释:)
lib GuiShared
lib TigerControlRoot
然而,构造函数被调用...
这是我的(简化)代码:
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]' violates the constraint of type parameter 'T'.
在另一个项目中使用了具有相同GuiShared库的类似代码,并且没有问题。
答案 0 :(得分:4)
好的,感谢所有(响应),但我在此期间修复了它。
问题如下: 失败的类位于一个DLL中,其调试模式下的输出路径设置为可执行文件的插件文件夹。到目前为止没问题,但它也将其依赖项复制到该文件夹中 但是,某些依赖项已经复制到可执行文件的根文件夹中。启动时的可执行文件搜索插件文件夹中的所有插件,并在需要时实例化插件 问题是插件使用插件文件夹中的依赖项,而可执行文件使用来自根文件夹的依赖项,这些依赖项基本上是不同目录中的相同文件,因此在运行clr时将它们视为2个不同的dll并且真的混淆了clr:)。
因此,当共享依赖项未复制到plugins文件夹时,一切运行正常,因为插件使用根文件夹中的依赖项,因此使用相同的dll。