4

我有一个用 C 编写的源代码,它使用了很多套接字发送者和侦听器调用,然后是几个操作函数。套接字是多播和单播。

很多读写操作都发生在它上面。我使用 cygwin 编译它,生成了一个 exe,它在所有 Windows 变体上都能正常工作。同时,当我从中生成一个 dll 并尝试通过 DLLimport 在 C# 中使用它时,它可以正常工作,直到它到达以下行

if((sendFd = socket(AF_INET,SOCK_DGRAM,0)) < 0)

Visual Studio 报错:

Attempt to read write protected memory, or other memory is corrupt.

没有所有套接字的东西或 fork() 它可以很好地执行基本操作,例如字符串操作等。

4

2 回答 2

0

如果我对您的理解正确,那么您正在尝试[DllImport]使用 Cygwin 在 .NET 程序集中编译的本机库?

好吧,这是灾难的秘诀:

您正试图在同一应用程序中使用两个不同的 C 运行时库。Cygwin 提供了自己的各种系统功能实现,它不仅仅是相应 Windows API 的包装器。这里有几件事可能出错:

  1. 可执行文件包含一些在调用main(). 此代码由编译器自动生成并初始化 C 运行时。您可以通过 P/Invoking DLL 绕过该代码。
  2. Cygwin 使用它自己的套接字代码,它需要进行一些低级系统调用来与网卡进行交互——并且由于 Cygwin 使用它自己的实现,它在 Windows 运行时的背后执行此操作。

如果您想在 .NET 应用程序中使用的本机 DLL 中使用套接字,您需要使用 Winsocks 并使用 Microsoft 的编译器对其进行编译,因此它与本机 Windows 库链接。

例如,您可以为此使用 Visual Studio 2012 Express for Desktop。

于 2012-12-19T11:19:53.260 回答
0

我实现了一个与 cygwin 兼容的 dotnet 加载器。你可以在这里找到它:https ://github.com/smx-smx/EzDotnet

为了能够从 .NET 使用 Cygwin(没有任何崩溃),入口点必须是 Cygwin 应用程序,在 cygwin 下编译和链接。

我添加了一个 cygwin 示例,该示例演示了 P/Invoke 的使用以及read(2)write(2)C# stdin/stdout 重定向到 cygwin(否则它将不可见)

./samples/cli/ezdotnet.exe ./CoreCLR/cygcoreclrhost.dll ./samples/Managed/Cygwin/bin/Debug/net5.0/Cygwin.dll ManagedSample.EntryPoint 条目

于 2021-01-02T12:52:33.353 回答