2009-03-04 79 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。