2009-03-04 19 views
2

私のプロジェクトには奇妙な問題があります。私は基底クラス(もう一度他の基底クラスから継承)から継承し、関数をオーバーライドするクラスを持っています。しかし、その関数が呼び出されると、オーバーライドされた関数ではなく、基本関数が呼び出されます。オーバーライドされた仮想関数は呼び出されません

しかし、中間クラスでその関数をオーバーライドすると呼び出されます。しかし、これは紛らわしいです:TigerControlRoot

LIB

  • クラスbScreen
    • 仮想関数InitializeRoc
  • をGuiSharedの図面で説明しましょう:)

    • libに

      • クラス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); 
         } 
        } 
    } 
    

    そして、それは十分ではなかった場合、私は、基本クラスIにいくつかの関数を呼び出すしようとすると、 TypeLoadExceptionを受け取ります。

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

    他のプロジェクトでも同じGuiShared libと同じコードが使用されていますが、問題はありません。

  • +0

    問題を説明するために、短いが完全なプログラム(コンソールアプリケーションが望ましい)を提供してください。私たちが現時点で入手しているスニペットは、(私にはとにかく)明確ではありません。 –

    +0

    TigerMiddleware.TigerRoc.Tigerの定義を教えてください。 –

    答えて

    4

    すべての回答ありがとうございますが、その間に修正しました。

    問題は次のとおりです。 エラーが発生したクラスは、デバッグモードの出力パスが実行可能ファイルのプラグインフォルダに設定されているDLLにあります。これまでのところ問題はありませんが、依存関係もそのフォルダにコピーされます。
    ただし、依存関係の一部は既に実行可能ファイルのルートフォルダにコピーされています。実行時に実行可能ファイルは、プラグインフォルダ内のすべてのプラグインを検索し、必要に応じてプラグインをインスタンス化します。
    プラグインはプラグインフォルダの依存関係を使用しますが、実行ファイルは基本的に異なるディレクトリの同じファイルであるルートフォルダの依存関係を使用するため、clrを実行すると2つの異なるDLLそれは本当にclr :)を混乱させる。

    共有依存関係がプラグインフォルダにコピーされていない場合、プラグインはルートフォルダからの拒否と同じdllを使用するため、すべて正常に動作します。

    +0

    これはおそらくあなた自身の答えを受け入れるべきであり、これはもはや「答えられていない」と表示されなくなります。 – oefe

    +0

    @oefe私は試しましたが、私は48時間待たなければなりません:) – Stormenet