2

我有一个用 C# 编写的 Windows 服务。它还包括一个独立的控制台模式,用于调试目的。它在几乎每台运行它的计算机上都可以正常工作,但是我们遇到了这样一种情况:当您尝试启动它时,该服务会锁定,然后由于超时而被终止。但是在同一台机器上以控制台模式运行它时,它可以正常启动。

调试很痛苦,因为我实际上无法访问正在发生这种情况的机器,我必须通过人工代理。但经过大量试错调试后,我终于将原因缩小到程序集负载。根据日志文件,当它第一次引用特定 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());
    }
}
4

2 回答 2

1

该程序集需要 45 秒才能连接,它尝试连接到 Internet 以在加载程序集之前验证有关该程序集的某些内容,但在该特定计算机上它被防火墙阻止。尝试启动 30 秒后,Windows 服务管理器放弃并终止该进程。

将程序集的加载移动到服务启动之后才可以正常启动(尽管在开始响应之前有 45 秒的延迟)。

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

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

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

<configuration>
    <runtime>
        <generatePublisherEvidence enabled="false"/>
    </runtime>
</configuration>
于 2010-08-23T22:03:23.590 回答
0

您是否在持有加载程序锁的同时对模块加载进行操作?

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

于 2010-07-20T19:34:25.577 回答