0

我用 C 语言为 C# 编写了一个简单的 Winsock 包装器。当我在某个线程中使用 Socket.Accept() 并在主线程中使用 client.Connect 时 - 我有时(收到 DllNotFoundException。

System.DllNotFoundException:引发了“System.DllNotFoundException”类型的异常。在 (wrapper managed-to-native) TcpWrapper:ES_ConnectClient (string,int) at TcpClientSocket.Connect (System.String address, Int32 port) [0x00000] in C:...\ESCore\TcpClientSocket.cs:21

TcpClientSocket.Connect 调用

[DllImport("ESocket")]
public static extern int ES_ConnectClient(string ip, int port);

我不知道为什么这种情况很少发生。

一些代码:

listener = new TcpListenerSocket(50231); //calling bind from library here
if (listener.Start()) //calling listen from library
{
    thread = new Thread(new ThreadStart(Listen));
    thread.Start();


    client = new TcpClientSocket();
    if(client.Connect("localhost", 50231)) //exception here!
    {
        ...
        client.Close();
    }
}

线程代码:

void Listen()
{
    while (m_Running)
    {
        if (listener.Pending()) //select from library
        {
            TcpClientSocket socket = listener.Accept(); //accept from library
            if (socket != null)
            {
                ...
                socket.Close();
            }
        }
    }
}

听众也在图书馆。

库代码: http: //pastie.org/private/hdgl9zqxfjt2arlkj11q

更新: 这只发生在 Unity3d 中。在单声道项目和 Microsoft .NET 中没有错误。

4

1 回答 1

1

这是一个简单的“找不到文件”错误消息。您从未说过“并且我确保 DLL 存在”,所以这可能是故障模式。

您必须确保 Windows 可以找到 DLL,它应该与您的 EXE 位于同一文件夹中。选择您的 C# 项目。Project + Add Existing Item,选择 ESocket.dll 文件,以便将其添加到您的项目中。选择它并切换到“属性”窗口。将“复制到输出目录”选项设置为“如果较新则复制”。如果 DLL 是由您的解决方案中的另一个项目构建的,那么请务必设置项目依赖项,以便始终首先构建该项目。重建你的项目。

这可确保 ESocket.dll 始终存在于构建目录中,并且 Windows 始终可以找到它。

于 2013-02-27T12:55:17.463 回答