Windows服务锁定assembly负载

我有一个用C#编写的Windows服务。 它还包括一个独立的控制台模式,用于调试目的。 它几乎在每台运行的计算机上运行良好,但是当你尝试启动它时,我们遇到了这个服务锁定的情况,然后它因超时而被杀死。 但是当它在同一台机器上以控制台模式运行时,启动正常。

调试很痛苦,因为我实际上无法访问正在发生的机器,我必须通过人工代理。 但经过一系列的试错调试后,我终于将原因缩小到assembly负载。 当它遇到对特定dll中任何数据类型的第一次引用时,它会根据日志文件在那里停止。 它甚至没有例外,它只是锁定。

[编辑]进一步检查后,它似乎没有永久锁定,实际完成加载库只需要大约40秒,这足以让Windows服务决定终止进程。

有任何线索如何调试这种情况?

这是关于我可以用它重现它的最简单的解决方案。 “之前”显示,但“在”和“之后”不显示。

private static void LoadAssembly() { Log("During"); MyNameSpace.MyClass x = new MyNameSpace.MyClass(); } static void Main(string[] args) { try { // Leaving out code to handle command line parameters // ... // Log("Before"); LoadAssembly(); Log("After"); if (Environment.UserInteractive) { Log("Starting in console mode"); ConnectionManager.Listen(); } else { Log("Starting in service mode"); ServiceBase.Run(new RunAsService()); } } catch (Exception ex) { Log(ex.ToString()); } } 

程序集需要45秒才能连接,它会在加载之前尝试连接到互联网以validation有关程序集的信息,但在该特定计算机上它被防火墙阻止。 尝试启动30秒后,Windows服务管理器放弃并终止该过程。

移动assembly的加载直到服务启动后允许它正常启动(尽管在开始响应之前有45秒的延迟)。

看起来它与生成发布者证据有关。 从这里http://msdn.microsoft.com/en-us/library/bb629393.aspx :

我们建议服务使用该元素来提高启动性能。 使用此元素还可以帮助避免可能导致超时和取消服务启动的延迟。

将以下内容放在app.config文件中可以消除延迟:

      

你是否在持有装载机锁的情况下处理模块负载?

请参阅此文章以进行调试: http : //msdn.microsoft.com/en-us/library/ms172219.aspx