2016-11-14 5 views
3

응용 프로그램 (65 개 프로젝트가있는 솔루션)에서 참조 된 모든 어셈블리는 런타임에 Ninject 모듈이 있는지 분석됩니다 (일부 필터링이 적용됨). 너무). 모듈은 나중에 Ninject 커널에로드되고 각 모듈은 커널에 대한 바인딩을 선언합니다.ReflectionOnly 모드에서 새 AppDomain에 어셈블리를로드 할 때 메소드가 구현되지 않음

참조 된 어셈블리를 반사 전용 모드로 별도의 어셈블리로로드하는 로더를 채택했습니다. Ninject가 디렉토리에서 어셈블리를로드 할 수있는 것과 다른 점은 디렉토리에로드해서는 안되는 모듈이있는 어셈블리가 디렉토리에 포함될 수 있다는 것입니다. 그리고 맨 처음에는 참조 된 모든 어셈블리가로드되지 않습니다. 여기

Method 'BeforeLoad' in type 'Lekis.AppBase.Core.BLLBaseCore' from assembly 'AppBaseCore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation. 

일부 "재미"사실은 다음과 같습니다

문제는 loader (사챠 이발사에게 신용)이

System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information 

한 항목과 LoaderExceptions와 약간의 어셈블리를로드 할 수 있다는 것입니다 :

  • BeforeLoad은 가상이며 구현 지난 주에 로더 예외는 다른 메소드가 구현되지 않았고 (그 메소드는 가상이 아니 었습니다) 나중에 명시 적으로 구현했을 때 메소드가 찾을 수 없다고 말했습니다.
  • 지난 주 조립 AppBaseCore의 대상 프레임 워크는 .NET 3.5이었고, 3 어셈블리는
  • 지금 조립 AppBaseCore의 대상 프레임 워크는 .NET 4로드하지 못했습니다 5 어셈블리는
  • 모든 응용 프로그램에 괜찮로드하지 못했습니다 그렇지 않으면

ILSpy 및 ILDAsm을 사용하여 어셈블리를 검사 할 때 어셈블리에 아무런 문제가 없습니다.

이 시점에서 저는 정말로 분실되어이 문제에 접근하는 방법을 모릅니다.

도움을 주시면 감사하겠습니다.

감사

+1

"메소드'BeforeLoad'는 가상이고 인터페이스 메소드의 구현입니다." 그래도 * 정말로 * 그래? [모든 대답은 여기에 있습니다.] (http://stackoverflow.com/questions/948785/)에서 버전 정렬/로딩과 충돌하지 않는지 확인하십시오.ILSpy/ILDAsm은 어셈블리가 구조적으로 유효하기 때문에 어떤 문제도보고하지 않습니다. –

+0

고마워요, @ 제로 몬스터. 나는 그것을 볼 것이다. –

답변

3

내 자신의 질문에 대답 :

AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies() 
{System.Reflection.RuntimeAssembly[15]} 
... 
[13]: {System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089} 
[14]: {System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089} 

과 주목 : 예외가 던져졌다

, 내가 만든 자식 응용 프로그램 도메인에로드 된 어셈블리를 스택 추적을 가서 나와 System.Data 어셈블리의 두 가지 버전. 해당 메소드의 유형은 System.Data.IDbTransaction입니다.

.NET Framework 3.5를 대상으로하는 프로젝트에서 처음 참조되었습니다. 4.0으로 변경하면 모든 것이 정상적으로 작동합니다.

어리석은 문제 ...