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

NServiceBus 3.3.5“;无法加载文件或程序集“;在子文件夹中,nservicebus,Nservicebus,我们使用NServiceBus.Host.exe托管服务,端点的程序集与NServiceBus.Host.exe位于同一文件夹中。在主文件夹下有一个子文件夹,其中包含处理消息的流程所需的程序集。我们遇到的问题是,当NServiceBus.Host.exe加载时,它会从子文件夹中找到程序集,但无法加载它们,并导致崩溃,出现错误: 未处理的异常:Magnum.StateMachine.StateMachineException:Topshelf.Internal.ServiceController

我们使用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]]在处理OnStart时处于初始状态---->Microsoft.Practices.ServiceLocation.ActivationException:尝试获取WindowsHost类型的实例时发生激活错误,密钥“MyPoint.BusMessageEndPoint,MyPoint,Version=4.3.0.0,Culture=neutral,PublicKeyToken=null”-->System.IO.FileNotFoundException:无法加载文件或程序集“MyAssembly,Version=4.3.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。
在System.Reflection.RuntimeAssembly.\n加载(AssemblyName文件名、字符串代码基、证据assemblySecurity、RuntimeAssembly位置提示、StackScrawMark和stackMark、Boolean throwOnFileNotFound、Boolean For Inspection、Boolean suppressSecurityChecks)
位于System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef,证据assemblySecurity,StackScrawMark&stackMark,布尔值用于内省,布尔值suppressSecurityChecks)
在System.Reflection.RuntimeAssembly.InternalLoad(字符串assemblyString、证据assemblySecurity、StackScrawMark和stackMark,布尔值用于内省)
在System.Reflection.Assembly.Load处(字符串assemblyString)
在System.Linq.Enumerable.Where中选择ArrayInterator
2.MoveNext() 位于System.Collections.Generic.List
1..ctor(IEnumerable
1集合) at System.Linq.Enumerable.ToList[TSource](IEnumerable
1源)
在c:\NServiceBus-NServiceBus-3.3.5-0\src\Hosting\NServiceBus.Hosting\genericost.cs中的NServiceBus.Hosting.genericost..ctor(IConfigureThisEndpoint说明符、字符串[]参数、IEnumerable
1默认配置文件、字符串endpointName、IEnumerable
1可扫描装配全名)中(在c:\NServiceBus-NServiceBus-3.3.5-0\src\hosting\NServiceBus.hosting.Windows\WindowsHost.cs第31行中键入endpointType、String[]参数、String endpointName、Boolean RunotherInstaller、Boolean RunInfrastructure Installer、IEnumerable
1 ScannablesSEMbliesFullName) 在c:\NServiceBus-NServiceBus-3.3.5-0\src\Hosting\NServiceBus.Hosting.Windows\HostServiceLocator.DoGetInstance(类型serviceType,字符串键)中的NServiceBus.Hosting.Windows\HostServiceLocator.cs:第41行 在Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(类型serviceType,字符串键)的第0行


主机似乎以某种方式找到了程序集,但无法加载它们。我没有找到任何方法告诉主机不要查看子文件夹内的内容。如果我将程序集从子文件夹移动到Main文件夹(与NServiceBus.host.exe位于同一文件夹中),则一切正常但是这使得我们的结构非常混乱,而且这个子文件夹方式在NserviceBus2.6上运行得很好-现在升级到3.3.5之后,我们遇到了一个问题

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

如果有人能帮我的话,非常感谢


如果我能澄清一下我们的情况,我会在这里对答案加上我的评论。谢谢你的回答

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


在NServiceBus 2.6中,子文件夹中的程序集不是由NServiceBus.Host加载的,就是它可以处理这些程序集,但现在无法处理。在我可以影响其加载内容之前,加载崩溃。在调试中,崩溃发生在Configure.With()之前发生这种情况时,我无法告诉NServiceBus关闭子文件夹。

子文件夹中不能有那些必要的程序集。我不知道这在2.6中起作用,但如果是这样的话,可能是无意的。我确实知道,在那里的某个地方,加载程序集的方法发生了更改,以便我们可以使用
Configure.With()
在所有情况下,无需在自托管时在
.With()
.WithWeb
之间做出选择。这可能是该更改的副作用


在任何情况下,如果主部署目录“不整洁”又有什么关系呢?我认为这只会使部署场景复杂化,使其看起来更漂亮,当然不会增加任何业务价值。

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

我现在已拒绝尝试使用该子文件夹进行此操作。我将标记您的作为此问题的答案,因为我们当前工作环境的原因很可能是在2.6中,即使子文件夹结构是不应该有。我遇到了完全相同的问题,我们在/plugin文件夹中部署了其他MEF插件。您是否将所有文件放在了同一个位置?@RobBird我将其他插件放在了NServiceBus主机文件夹外的文件夹中,并从那里加载。我测试了NServiceBus文件夹中的所有插件,但由于订阅服务器速度太慢,我不得不将其删除。我希望我能将插件放在NServiceBus主机文件夹的子文件夹中,因为那是w