[.net] 어셈블리 오류에서 유형을로드 할 수 없습니다.

Castle Windsor의 Fluent Interface를 배우기 위해 다음과 같은 간단한 테스트를 작성했습니다.

using NUnit.Framework;
using Castle.Windsor;
using System.Collections;
using Castle.MicroKernel.Registration;

namespace WindsorSample {
    public class MyComponent : IMyComponent {
        public MyComponent(int start_at) {
            this.Value = start_at;
        }
        public int Value { get; private set; }
    }
    public interface IMyComponent {
        int Value { get; }
    }

    [TestFixture]
    public class ConcreteImplFixture {
        [Test]
        public void ResolvingConcreteImplShouldInitialiseValue() {
            IWindsorContainer container = new WindsorContainer();
            container.Register(Component.For<IMyComponent>().ImplementedBy<MyComponent>().Parameters(Parameter.ForKey("start_at").Eq("1")));
            IMyComponent resolvedComp = container.Resolve<IMyComponent>();
            Assert.AreEqual(resolvedComp.Value, 1);
        }
    }
}

TestDriven.NET을 통해 테스트를 실행하면 다음 오류가 발생합니다.

System.TypeLoadException : Could not load type 'Castle.MicroKernel.Registration.IRegistration' from assembly 'Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc'.
at WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue()

NUnit GUI를 통해 테스트를 실행하면 다음과 같은 결과가 나타납니다.

WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue:
System.IO.FileNotFoundException : Could not load file or assembly 'Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc' or one of its dependencies. The system cannot find the file specified.

Reflector에서 참조하고있는 어셈블리를 열면 다음 정보를 확인할 수 있습니다.

Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc

확실히 Castle.MicroKernel.Registration.IRegistration이 포함되어 있습니다 .

무슨 일이 일어날까요?

바이너리는 캐슬최신 빌드 에서 가져 왔지만 nant로 작업 한 적이 없기 때문에 소스에서 다시 컴파일하지 않고 bin 디렉토리에있는 파일을 가져 왔습니다. 내 프로젝트가 문제없이 컴파일된다는 점도 지적해야합니다.



답변

GAC (전역 어셈블리 캐시)의 어셈블리가로드되고 있다고 생각하는 어셈블리를 재정의 할 수있는 위치입니까? 이것은 일반적으로 잘못된 어셈블리가로드 된 결과입니다. 이는 보통 GAC에 내가 bin / Debug에있는 버전을 재정의하는 무언가가 있음을 의미합니다.


답변

하나의 프로젝트가 다른 프로젝트를 참조하고 (예 : ‘클래스 라이브러리’를 참조하는 ‘Windows 애플리케이션’유형) 둘 다 동일한 어셈블리 이름을 가진 경우이 오류가 발생합니다. 참조 된 프로젝트의 이름을 강력하게 지정하거나 참조하는 프로젝트의 어셈블리 이름을 바꿀 수 있습니다 (VS의 프로젝트 속성 ‘응용 프로그램’탭에서).


답변

나를 위해 이것에 대한 해결책은 위에서 언급되지 않았기 때문에 긴 꼬리에 내 대답을 추가 할 것이라고 생각했습니다.

결국 클래스에 대한 오래된 참조를 갖게되었습니다. HttpHandler더 이상 사용되지 않고 더 이상 유효한 참조가 아닌 web.config )에 생겼습니다. 어떤 이유로 Studio에서 실행하는 동안 무시되었으므로 (또는 내 dev 설정 내에서 해당 클래스에 여전히 액세스 할 수 있습니까?) IIS에 배포를 시도한 후에 만이 오류가 발생했습니다. web.config에서 어셈블리 이름을 검색하고 사용하지 않는 처리기 참조를 제거한 다음이 오류가 사라지고 모든 것이 잘 작동합니다. 이것이 다른 사람에게 도움이되기를 바랍니다.


답변

나는 똑같은 문제가 있었고 이름 공간이나 프로젝트 명명과 관련이 없었습니다.

그러나 여러 사용자가 암시했듯이 여전히 참조되는 오래된 어셈블리와 관련이 있습니다.

모든 프로젝트의 “bin”/ binary 폴더를 모두 삭제하고 전체 솔루션을 다시 빌드하는 것이 좋습니다. 이것은 잠재적으로 오래된 어셈블리를 씻어 내고 MEF가 문제없이 모든 플러그인을 내보냈습니다.


답변

이 오류가 발생하고 StackOverflow 또는 다른 곳에서 찾은 것이 아무것도 해결되지 않았지만 bmoeskau의 대답 이 질문에 은 아직 답변으로 언급되지 않은 수정에 대한 올바른 방향을 가리 켰습니다. 내 대답은 원래 질문과 엄격하게 관련이 없지만이 문제가있는 사람이 Google 또는 유사한 검색을 통해 여기에서 찾을 수 있다는 가정하에 여기에 게시하고 있습니다 (이것이 나를 다시 물면 지금부터 한 달 후 나처럼 , arg!).

내 어셈블리는 GAC에 있으므로 이론적으로 사용할 수있는 어셈블리 버전은 하나뿐입니다. IIS가 이전 버전을 유용하게 캐싱하고이 오류를 제공하는 것을 제외하고 는. 방금 GAC에서 어셈블리를 변경, 재 구축 및 재설치했습니다. 한 가지 가능한 해결책은 작업 관리자를 사용하여 w3wp.exe를 종료하는 것 입니다. 이렇게하면 IIS가 GAC에서 어셈블리를 다시 읽게됩니다. 문제가 해결되었습니다.


답변

Version = 1.0.3.0은 Castle RC3를 나타내지 만, 유창한 인터페이스는 RC3 출시 후 몇 달 후에 개발되었습니다. 따라서 버전 관리 문제가있는 것 같습니다. 아마도 당신은 GAC에 Castle RC3를 등록했고 그것은 그것을 사용하고있을 것입니다.


답변

나는 때때로 이것을 얻고 항상 GAC에서 어셈블리를 가지고 있습니다.