Main(string [] args)方法未调用

MY_*_*Y_G 1 c# visual-studio visual-studio-2017

我正在使用Visual Studio 2017。

每当我按下F5开始调试程序时,我都会注意到该类Main(string[] args)内部的方法Program没有被调用,即使内部的字段Program已初始化,您也可以从下面的屏幕截图中看到:

在此处输入图片说明

创建TcpClient实例并将其分配给相应的字段后,调试器再也不会达到我在Main(string[] args)方法上设置的断点。

可以肯定的是,我已将项目的启动对象设置为Program类。那没有解决问题:

在此处输入图片说明

我想念什么?

编辑:

我已经Console.WriteLine("Entering Main method...")Main方法中添加了内容,但是当我开始调试时它不会被打印到控制台中。

从字面上看,在TcpClient创建实例之后,什么也没有发生(或者说,没有立即可见的东西)。该程序不会自行终止;控制台保持空白。

编辑:

事实证明,TcpClient构造函数内部发生崩溃。

can*_*on7 5

请记住,TcpClient(string, int)构造函数此时会打开一个新连接(doc):

初始化TcpClient类的新实例,并连接到指定主机上的指定端口。
...
此构造函数创建一个新的TcpClient并尝试对提供的主机名和端口号进行同步连接。

如果我复制/粘贴您的代码(插入自己的代码RemoteServerIpAddressString),那么在尝试构造时,我会看到该应用程序挂起TcpClient。如果此时中断调试器,则可以看到它卡在了System.Net.Sockets.Socket.DoConnect,它试图连接到远程计算机。

一段时间后,它放弃,引发异常,并TypeInitializationException引发异常,这会破坏调试器。

这符合您的观察:

从字面上看,在创建TcpClient实例之后,什么也没有发生(或者,没有立即可见的东西)。该程序不会自行终止;控制台保持空白。

此时,TcpClient仍在尝试连接。在成功之前,永远不会初始化类型,并且在这种情况发生Main之前永远不会运行。如果您将其放置足够长的时间,它可能会像我的一样失败。

如果我确定s TcpClient正在连接到开放的端口,则TcpClient构造函数将立即完成并Main运行。


在静态构造函数中执行长时间运行的操作(尤其是与网络有关的操作)是一个非常糟糕的主意。在初始化一个类型时,CLR需要获取一个锁,这会阻止其他类型的初始化,并可能导致死锁。

您可能想要构造TcpClient内部Main方法,或将其构造为:

private static readonly TcpClient TcpClient = new TcpClient();
Run Code Online (Sandbox Code Playgroud)

然后在主要:

TcpClient.Connect(...);
Run Code Online (Sandbox Code Playgroud)