NServiceBus 3.3.5“无法加载文件或程序集”在子文件夹中

时间:2013-06-06 11:26:35

标签: nservicebus

我们使用NServiceBus.Host.exe来托管我们的服务,我们的端点的程序集与NServiceBus.Host.exe位于同一个文件夹中。在主文件夹下,我们有一个子文件夹,其中包含处理消息的进程所需的程序集。我们遇到的问题是,当NServiceBus.Host.exe加载时,它会从子文件夹中找到程序集,但无法加载它们并因错误而崩溃:


未处理的异常: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个集合)    at System.Linq.Enumerable.ToList [TSource](IEnumerable 1 source) at NServiceBus.Hosting.GenericHost..ctor(IConfigureThisEndpoint specifier, String[] args, IEnumerable 1 defaultProfiles,String 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行    位于c:\ NServiceBus-NServiceBus-3.3.5-0 \ src \ hosting \ NServiceBus.Hosting.Windows \ HostServiceLocator.cs中的NServiceBus.Hosting.Windows.HostServiceLocator.DoGetInstance(类型serviceType,String key):第41行    在Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(类型serviceType,String key)in:第0行


主机似乎以某种方式查找程序集但无法加载它们。我还没有找到任何方法告诉主机不要查看子文件夹。如果我将程序集从子文件夹移动到主文件夹(在NServiceBus.Host.exe所在的同一文件夹中),一切正常,但这使我们的结构非常不整洁,这个子文件夹方式适用于NServiceBus 2.6 - 现在升级到3.3.5我们遇到了问题。

是否有某种方法可以阻止主机加载子文件夹 - 或者如果主机在子文件夹中找到程序集,为什么无法加载它们?这也可以解决我们的问题。

非常感谢有人可以帮助我。


如果我能稍微澄清一下我的情况,我会在这里添加我的评论。谢谢你的答案!

子文件夹中的程序集不需要由NSericeBus.Host.exe加载 - 它们是通过使用MEF从我们的消息端点程序集(由NServiceBus.Host加载)加载的。

在NServiceBus 2.6中,子文件夹中的程序集未由NServiceBus.Host加载,或者它可以处理它们,现在无法执行此操作。在我可以影响它加载的内容之前,负载崩溃了。在调试中,崩溃发生在Configure.With()发生之前,所以我不能告诉NServiceBus关闭子文件夹。

2 个答案:

答案 0 :(得分:1)

如果通过IWantCustomInitialization接口启用自定义初始化,则.With()方法可以选择提供特定目录或程序集或类型列表。

答案 1 :(得分:0)

您不能在子文件夹中拥有这些必要的程序集。我不知道这在2.6中有效但如果是这样的话可能是无意的。我知道在那里的某处用于加载程序集的方法已更改,因此我们可以在所有实例中使用Configure.With(),而不必在自托管时在.With().WithWeb之间做出决定。也许这是这种变化的副作用。

无论如何,如果主要部署目录“不整洁”,为什么重要?我认为这会使部署方案变得复杂化,以使其看起来更漂亮,当然也不会增加任何商业价值。