0

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 ではエラーはありません。

4

1 に答える 1

1

これは単純な「ファイルが見つかりません」というエラー メッセージです。「DLLが存在することを確認しました」とは決して言わなかったので、それがおそらく失敗モードです。

Windows が DLL を検出できることを確認する必要があります。DLL は、EXE と同じフォルダーに存在する必要があります。C# プロジェクトを選択します。プロジェクト + 既存の項目を追加し、ESocket.dll ファイルを選択してプロジェクトに追加します。それを選択し、[プロパティ] ウィンドウに切り替えます。[出力ディレクトリにコピー] オプションを [新しい場合はコピー] に設定します。DLL がソリューション内の別のプロジェクトによってビルドされている場合は、必ずプロジェクトの依存関係を設定して、プロジェクトが常に最初にビルドされるようにしてください。プロジェクトを再構築します。

これにより、ESocket.dll がビルド ディレクトリに常に存在し、Windows が常にそれを検出できるようになります。

于 2013-02-27T12:55:17.463 に答える