문제

프로젝트에 이상한 문제가 있습니다. 기본 클래스에서 상속되는 클래스 (다시 다른 기본 클래스에서 상속)를 상속 받고 함수를 무시합니다. 그러나 해당 함수를 호출하면 재정의 함수가 아니라 기본 함수를 호출하지 않습니다.

그러나 중산층에서 해당 기능을 무시하면 호출됩니다. 그러나 이것은 혼란 스럽습니다 : 그림으로 설명합시다 :)

  • Lib Guishared

    • 클래스 Bscreen
      • 가상 함수 초기화 이저
  • lib tigercontrolroot

    • 클래스 btigerscreen
      • function initializeroc <- 재정의하면 여기에서 재정의되면 호출됩니다.
  • lib tigercontrolrootcommonscreens
    • 클래스 점검
      • function 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();
        }
    }
}

실패한 클래스 (또는 해당 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'.

동일한 기안 LIB를 가진 유사한 코드가 다른 프로젝트에 사용되며 문제가 없습니다.

도움이 되었습니까?

해결책

좋아, 모든 () 응답에 감사하지만 그 동안 나는 그것을 고쳤다.

문제는 다음과 같습니다. 실패 클래스는 DLL에 있으며 디버그 모드의 출력 경로가 실행 파일의 플러그인 폴더로 설정됩니다. 지금까지는 문제가 없지만 종속성을 해당 폴더에 복사합니다.
그러나 일부 종속성은 이미 실행 파일의 루트 폴더에 복사되었습니다. IT 시작시 실행 파일은 플러그인 폴더의 모든 플러그인을 검색하고 필요한 경우 플러그인을 인스턴스화합니다.
문제는 플러그인이 플러그인 폴더의 종속성을 사용하고 실행 파일은 기본적으로 다른 파일의 루트 폴더의 종속성을 사용한다는 것입니다. CLR을 혼동합니다 :).

따라서 공유 종속성이 플러그인 폴더에 복사되지 않으면 플러그인이 루트 폴더의 DEFEDENCE를 사용하여 동일한 DLL을 사용하기 때문에 모든 것이 정상적으로 실행됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top