我在C中为C#编写了一个Winsock的简单包装器。当我在某些线程中使用Socket.Accept(),在主线程中使用client.Connect时,有时我(接收DllNotFoundException )。
System.DllNotFoundException:抛出了“System.DllNotFoundException”类型的异常。at (包装托管到本地) TcpWrapper:ES_ConnectClient (string,int) at TcpClientSocket.Connect (System.String地址,Int32端口) 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和Microsoft .NET中没有错误。
发布于 2013-02-27 12:55:17
这是一个简单的“文件找不到”错误消息。您从未说过“而且我确保DLL是存在的”,所以这是可能的失败模式。
您必须确保Windows可以找到DLL,它应该与EXE位于同一个文件夹中。选择您的C#项目。项目+添加现有项目,选择ESocket.dll文件,以便将其添加到项目中。选择它并切换到“属性”窗口。将副本设置为选项为“复制(如果更新)”。如果DLL是由解决方案中的另一个项目生成的,那么一定要设置项目依赖关系,以便始终先构建该项目。重建你的项目。
这确保了ESocket.dll始终存在于构建目录中,并且始终可以找到它。
https://stackoverflow.com/questions/15109343
复制相似问题