2013-06-06 3 views
3

우리는 NServiceBus.Host.exe를 사용하여 서비스를 호스팅하며 엔드 포인트 용 어셈블리는 NServiceBus.Host.exe가있는 동일한 폴더에 있습니다. 메인 폴더 아래에는 메시지를 처리하는 프로세스에 필요한 어셈블리가 들어있는 하위 폴더가 있습니다. 우리가 가지고있는 문제는 그것이 하위 폴더에서 어셈블리를 찾지 만 오류가 그들과 충돌을로드 할 수없는 경우 NServiceBus.Host.exe로드 :NServiceBus 3.3.5 하위 폴더에 "파일 또는 어셈블리를로드 할 수 없습니다."


처리되지 않은 예외 : Magnum.StateMachine.StateMachineException : 예외가 발생 Topshelf.Internal.ServiceController 1[ [NServiceBus.Hosting.Windows.WindowsHost, NServiceBus.Host, Version=3.0.0.0, Culture=neutral, PublicKeyToken=9fc386479f8a226c]] during state Initial while handling OnStart ---> Microsoft.Practices.ServiceLocation.ActivationException: Activation error occured while trying to get instance of type WindowsHost, key "MyPoint.BusMessageEndPoint, MyPoint, Version=4.3.0.0, Culture=neutral, PublicKeyToken=null" ---> System.IO.FileNotFoundException: Could not load file or assembly 'MyAssembly, Version=4.3.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified. at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) at System.Reflection.Assembly.Load(String assemblyString) at System.Linq.Enumerable.WhereSelectArrayIterator 2.MoveNext() System.Collections.Generic.List 1..ctor(IEnumerable 1 명 컬렉션) System.Linq.Enumerable.ToList [TSource (IEnumerable을 1 source) at NServiceBus.Hosting.GenericHost..ctor(IConfigureThisEndpoint specifier, String[] args, IEnumerable 1 defaultProfiles에서 문자열 endpointName에서 , IEnumerable을 1 scannableAssembliesFullName) in c:\NServiceBus-NServiceBus-3.3.5-0\src\hosting\NServiceBus.Hosting\GenericHost.cs:line 145 at NServiceBus.Hosting.Windows.WindowsHost..ctor(Type endpointType, String[] args, String endpointName, Boolean runOtherInstallers, Boolean runInfrastructureInstallers, IEnumerable 1에 scannableAssembliesFullName) in c : \ NServiceBus-NServiceBus-3.3.5-0 \ src \ hosting \ NServiceBus.Hosting.Windows \ WindowsHost.cs : 줄 31 at NServic c : \ NServiceBus-NServiceBus-3.3.5-0 \ src \ hosting \ NServiceBus.Hosting.Windows \ HostServiceLocator.cs의 eBus.Hosting.Windows.HostServiceLocator.DoGetInstance (type serviceType, String key) : Microsoft의 41 줄. 에서 Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance (유형 ServiceType 자리, 문자열 키) : 라인 0


이 호스트가 어떤 방법으로 어셈블리를 찾지 만 그것들을로드 할 수 없습니다 것으로 보인다. 호스트에게 하위 폴더를 들여다 보지 말라고 알리는 방법을 찾지 못했습니다. 어셈블리를 서브 폴더에서 mainfolder (NServiceBus.Host.exe가있는 폴더와 같은 폴더)로 옮기면 모든 것이 잘 작동하지만, 이는 구조가 매우 불안정 해지고이 서브 폴더 방식이 NServiceBus 2.6에서 잘 작동합니다 - 이제 업그레이드 후 3.3.5 문제가 있습니다.

호스트에서 하위 폴더를 차단하는 방법이 있습니까? 또는 호스트가 하위 폴더에서 어셈블리를 찾으면 왜로드 할 수 없습니까? 그것도 우리의 문제를 해결할 것입니다.

많은 도움을 주실 수 있으면 고맙습니다.


우리의 사례를 좀 더 명확히 할 수 있다면 여기에 대한 답에 의견을 추가하겠습니다. 답변 주셔서 감사합니다!

NSericeBus.Host.exe에서 하위 폴더의 어셈블리를로드 할 필요가 없습니다. MEF를 사용하여 메시지 끝점 어셈블리 (NServiceBus.Host에서로드 됨)에서로드됩니다.

NServiceBus 2.6에서는 하위 폴더의 어셈블리가 NServiceBus.Host에 의해로드되지 않았거나 처리 할 수 ​​없어 이제 수행 할 수 없습니다. 로드되는 내용에 영향을 미치기 전에로드가 충돌합니다. 디버그에서는 Configure.With()가 발생하기 전에 충돌이 발생하므로 NServiceBus에 하위 폴더를 닫으라고 알릴 수 없습니다.

+0

동일한 문제가 발생했습니다. 추가 MEF 플러그인을/Plugin 폴더에 배포합니다. 모든 파일을 같은 장소에 넣었습니까? –

+0

@RobBird NServiceBus 호스트 폴더 밖에있는 폴더에 추가 플러그인을 넣고 거기에서로드합니다. NServiceBus 폴더에있는 모든 플러그인을 테스트했지만 가입자를 너무 느리게하여 제거해야했습니다. NServiceBus 호스트 폴더의 하위 폴더에 플러그인을 넣을 수 있으면 좋겠다. 설치가 너무 깔끔하기는하지만 그 환경을 위해 최선의 해결책이 될 수는 없기 때문이다. – user2459400

답변

0

하위 어셈블리에는 필요한 어셈블리를 사용할 수 없습니다. 이것이 2.6에서 작동했다는 것을 알지 못했지만 만약 그렇다면 아마 의도하지 않았을 것입니다. 어셈블리를로드하는 데 사용 된 메소드가 변경되어 모든 인스턴스에서 Configure.With()을 사용할 수 있고 자체 호스팅 할 때 .With().WithWeb 사이를 결정할 필요가 없다는 것을 알고 있습니다. 아마도 이것이 그 변화의 부작용 일 것입니다.

주 배포 디렉토리가 "깔끔하지 않은"경우 어째와 왜 중요한가요? 나는 이것이 배치 시나리오를 더욱 복잡해 보이게하고 비즈니스 가치를 추가하지는 않을 것이라고 생각합니다.

+0

나는 지금 시도하고 하위 폴더와 함께 작동 시키려고 시도를 기각했습니다. 현재 작업 환경에 대한 이유는 하위 폴더 구조가 2.6에서 없어야 함에도 불구하고 제대로 작동했기 때문에 당신의 답을이 답변으로 표시 할 것입니다. – user2459400

1

IWantCustomInitialization 인터페이스를 통해 사용자 지정 초기화를 사용하도록 설정하면 .With() 메서드에 특정 디렉터리 나 어셈블리 또는 형식 목록을 제공하는 옵션이 있습니다.

관련 문제