2009-03-04 78 views
2

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

但是,当我重写中间类中的函数时,它被调用。但是,这是令人困惑:让我们用绘图:)

  • LIB GuiShared

    • 类bScreen
      • 虚函数InitializeRoc
  • LIB TigerControlRoot

    解释
    • 类bTigerScreen
      • 覆盖功能InitializeRoc < - 这里重写时,它被调用
  • LIB TigerControlRootCommonScreens
    • 类CheckInRules
      • 超越功能InitializeRoc < - 不叫:但是小号

构造函数被调用......

这是我(简化)代码:

共享基地

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

失败的类(或从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); 
     } 
    } 
} 

如果这还不够,当我尝试调用基类我一些功能收到一个TypeLoadException。

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

与同GuiShared LIB相似的代码在另一个项目中使用,也没有任何问题。

+0

请提供一个简短但完整的程序(最好是一个控制台应用程序)来演示问题。我们目前得到的片段并不是很清楚(无论如何,对我来说)。 – 2009-03-04 10:21:39

+0

你能告诉我们TigerMiddleware.TigerRoc.Tiger的定义吗? – 2009-03-04 10:25:13

回答

4

好的,谢谢所有()的回应,但我在此期间修正了它。

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

因此,当共享依赖关系没有复制到插件文件夹时,一切运行正常,因为插件使用来自根文件夹的依赖关系,因此也是相同的DLL。