gpt4 book ai didi

c# - 奇怪的 DllImport 行为(仅在 Unity3d 中)

转载 作者:行者123 更新时间:2023-11-28 07:44:44 25 4
gpt4 key购买 nike

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

System.DllNotFoundException: Exception of type 'System.DllNotFoundException' was thrown. 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 中。在单声道项目和 Microsoft .NET 中没有错误。

最佳答案

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

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

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

关于c# - 奇怪的 DllImport 行为(仅在 Unity3d 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15109343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com