3

プロジェクトに奇妙な問題があります。基本クラスから継承し (これも別の基本クラスから継承します)、関数をオーバーライドするクラスがあります。ただし、その関数が呼び出されると、オーバーライドされた関数は呼び出されず、基本関数が呼び出されます。

ただし、中間クラスでその関数をオーバーライドすると、呼び出されます。しかし、これは紛らわしいです: 図面で説明しましょう :)

  • lib GuiShared

    • クラス bScreen
      • 仮想関数 InitializeRoc
  • lib TigerControlRoot

    • クラス bTigerScreen
      • override function 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'、'Ppb.GuiShared.bMain`1+LoadEventArgs[T]' は、型パラメーター 'T' の制約に違反しています。

同じ GuiShared ライブラリを使用した同様のコードが別のプロジェクトで使用されており、問題はありません。

4

1 に答える 1

4

わかりました、すべての応答に感謝しますが、その間に修正しました。

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

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

于 2009-03-04T11:49:41.967 に答える