C# 用の C で Winsock の単純なラッパーを作成しました。一部のスレッドで Socket.Accept() を使用し、メインスレッドで client.Connect を使用すると、時々 ( DllNotFoundException を受け取ります。
System.DllNotFoundException: タイプ 'System.DllNotFoundException' の例外がスローされました。at (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 でのみ発生します。mono プロジェクトと Microsoft .NET ではエラーはありません。