3

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


未处理的异常:Magnum.StateMachine.StateMachineException:System.Linq.Enumerable.ToList [TSource](IEnumerable 1 defaultProfiles,String 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)的 System.Collections.Generic.List 1 集合的 Topshelf.Internal.ServiceController 2.MoveNext() 中发生异常endpointName, IEnumerable 1 scannableAssembliesFullName) in c:\NServiceBus-NServiceBus-3.3.5-0\src\hosting\NServiceBus.Hosting.Windows\WindowsHost.cs:NServiceBus.Hosting.Windows.HostServiceLocator.DoGetInstance 的第 31 行(键入 serviceType,字符串键)在 c:\NServiceBus-NServiceBus-3.3.5-0\src\hosting\NServiceBus.Hosting.Windows\HostServiceLocator.cs:Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance 的第 41 行(键入 serviceType,字符串键)在:第 0 行1..ctor(IEnumerable1 source) at NServiceBus.Hosting.GenericHost..ctor(IConfigureThisEndpoint specifier, String[] args, IEnumerable1 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


似乎主机以某种方式找到了程序集,但无法加载它们。我还没有找到任何方法告诉主机不要查看子文件夹内部。如果我将程序集从子文件夹移动到主文件夹(在 NServiceBus.Host.exe 所在的同一文件夹中),一切正常,但这会使我们的结构非常混乱,并且这种子文件夹方式在 NServiceBus 2.6 上工作得很好 - 现在升级到3.3.5 我们有问题。

有没有办法阻止主机加载子文件夹 - 或者如果主机在子文件夹中找到程序集为什么不能加载它们?那也可以解决我们的问题。

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


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

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

在 NServiceBus 2.6 中,子文件夹中的程序集要么没有由 NServiceBus.Host 加载,要么它可以处理它们,但现在无法这样做。在我影响它加载的内容之前,负载就崩溃了。在调试中,崩溃发生在 Configure.With() 发生之前,所以我不能告诉 NServiceBus 关闭子文件夹。

4

2 回答 2

1

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

于 2013-06-07T14:26:36.907 回答
0

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

无论如何,主部署目录是否“不整洁”有什么关系?我认为这只会使部署场景复杂化,试图让它看起来更漂亮,当然不会增加任何商业价值。

于 2013-06-07T14:22:48.800 回答