Visual studio 2017 c++/cli检查网络连接

Visual studio 2017 c++/cli检查网络连接,visual-studio-2017,c++-cli,tcpclient,Visual Studio 2017,C++ Cli,Tcpclient,这是代码 public: static bool TcpSocketTest () { try { System::Net::Sockets::TcpClient Client = gcnew System::Net::Sockets::TcpClient ("www.google.com", 80); Client.Close (); return true; }

这是代码

public: static bool TcpSocketTest ()
    {
        try
        {
            System::Net::Sockets::TcpClient Client = gcnew System::Net::Sockets::TcpClient ("www.google.com", 80);

            Client.Close ();

            return true;
        }
        catch (System::Exception ^ex)
        {
            return false;
        }
    }
我正试图检查网络连接,在互联网上找到了这段代码,并对其进行了一些修改,以配合我的项目,但它说

no suitable user-defined conversion from "System::Net::Sockets::TcpClient ^" to "System::Net::Sockets::TcpClient" exists     Project1   33  

在C++/CLI中,您需要声明带有尾随
^
的对象引用,类似于本机指针的
*
运算符。此外,大多数引用上的方法都可以使用
->
操作符调用。试试这个:

public: static bool TcpSocketTest ()
    {
        try
        {
            System::Net::Sockets::TcpClient^ Client = gcnew System::Net::Sockets::TcpClient ("www.google.com", 80);

            Client->Close ();

            return true;
        }
        catch (System::Exception ^ex)
        {
            return false;
        }
    }
编辑:正如Hans Passant正确指出的那样,该代码还有另一个问题,这不是语法问题。由于
TcpClient
实现了
IDisposable
,并且
Close()
调用位于
try
块中,因此在出现异常时,永远不会处理对象引用。因此,
Close()
调用应该在
try
块之外

然而,C++/CLI提供了一种更好的方法来处理这个问题,称为“堆栈语义”。它相当于使用语句的C#
。它是这样使用的:

public: static bool TcpSocketTest ()
    {
        try
        {
            System::Net::Sockets::TcpClient Client (L"www.google.com", 80);

            // Dispose() or Close() not needed anymore

            return true;
        }
        catch (System::Exception ^ex)
        {
            return false;
        }
    }
因此,
TcpClient
引用被声明为局部变量。但实际上,它将在堆上创建,一旦变量
Client
超出范围,就会自动调用
Client.Dispose()
。因此,
Close()
调用完全是不必要的,并且无论抛出异常还是方法正常终止,都会正确地处理对象

感谢Hans Passant指出这一点。在C++/CLI中,
IDispose
的堆栈语义是很好的实践


请注意,我将构造函数中的字符串文本更改为
L“…”
。这也是一种很好的做法,因为一旦使用8位范围之外的Unicode字符,省略“L”将导致问题。

使用
gcnew
您正在托管堆上创建对象的句柄,在c++-cli中,您需要用“hat”符号
^
来指示它。对象初始化需要看下一步:
TcpClient^Client=gcnew TcpClient(…
),还需要使用
->
操作符来调用此类对象的方法,如:
Client->Close();
。更多内容。这只会阻止编译器抱怨,这不是正确的方法。谷歌“C++/CLI堆栈语义”以了解更多信息。@HansPassant您是对的,
IDispose
在这里处理不正确。我在回复中仅解决了语法错误。我已相应更新了我的帖子。谢谢!