在启动时挂在Windows 2012上的.NET应用程序

我们有一个客户提供了一个Window 2012 Hyper-V服务器,该服务器拥有一个Window 2012 Multipoint客户端操作系统,我们运行基于.NET的(v3.5)软件产品。

不幸的是,我们的Windows服务不能启动,有一些机器。 他们每个人在写任何东西之前写日志,例如:

<DllImport("Kernel32.dll", _ SetLastError:=True, _ CharSet:=CharSet.Unicode, _ entrypoint:="OutputDebugString", _ CallingConvention:=CallingConvention.StdCall)> _ Public Shared Sub OutputDebugString(ByVal str As String) End Sub Protected Overrides Sub OnStart(ByVal args() As String) OutputDebugString("Service is starting...") m_worker = New Thread(AddressOf serviceThread) m_worker.Start() End Sub '... 

问题是这个debuggingstring从来没有进入Dbgview,也没有使用任何CPU(它总是坐落在0%,该服务将最终超时。

我们有一个交换机,我们可以添加到服务,以便能够运行它作为一个WinForms应用程序来testing这样的事情,当我试图用这个开关运行它,程序需要大约2分钟到达第一线和输出这个debuggingstring,所以难怪服务没有启动!

我打开Fusion,它生成融合日志就好了,似乎没有任何错误,但我失去了为什么这些.NET应用程序需要这么长的时间才能到我们的代码库?

我们有很多其他的客户(尽pipe没有使用Windows 2012),这只发生在很多机器上。 依赖程序集计数不超过12个,整个应用程序小于4MB。

任何人都可以build议如何进一步调查..?

事件查看器似乎是空的,但“服务没有及时响应启动或控制请求”。

游戏规格是4CPU和4GB RAM,硬盘有足够的空间。

更新:奇怪的是,当有一个互联网连接提供给机器的问题似乎消失? 现在我们的软件不需要这个(因为我们假设这是在一个没有访问权限的站点上运行),但是也许有一些需要发生的许可检查,或者是一个依赖于我们的networking上没有的服务器的组策略? (他们确实给我们从他们的实验室克隆了一台机器)。 有任何想法吗?

这通常是由.Net框架试图validation您正在加载的所有程序集上的签名造成的。 微软在这方面有 几个 KB和博客 文章 ,简单的答案是你可以在machine.config或应用程序的config文件中禁用它:

 <configuration> <runtime> <generatePublisherEvidence enabled="false"/> </runtime> </configuration> 

Shawnfa很好地解释了这个长长的答案:

当CLR加载具有Authenticode签名的程序集时,它总是会尝试validation签名。 这与Windows加载程序相反,Windows加载程序仅在特定情况下validation文件的签名,例如文件是ActiveX控件时。 此validation可能相当耗时,因为它可能需要多次点击networking才能下载最新的证书吊销列表,并且还要确保在到受信任根的路上有完整的有效证书链。 所以,当一个Authenticode签名被应用到程序集中时,在程序集加载时看到几秒钟的延迟并不是闻所未闻的。

如果您位于受限制的访问networking中,则每次到CRL分发点的呼叫都必须超时,可能会将延迟时间延长到2分钟以上。

在debugging方面,您通常可以通过debugging器中的代码并查看调用堆栈来解决这种挂起问题。 像Process Explorer一样简单的应该能够加载符号,并显示你正在等待一个CRL。