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].NETアセンブリでCygwinでコンパイルされたネイティブライブラリを試していますか?

さて、それは災害のレシピです:

同じアプリケーションで2つの異なるCランタイムライブラリを使用しようとしています。Cygwinは、さまざまなシステム関数の独自の実装を提供します。これは、対応するWindowsAPIの単なるラッパーではありません。ここでうまくいかない可能性のあることがいくつかあります。

  1. 実行可能ファイルには、を呼び出す前に実行される初期化コードと起動コードが含まれていますmain()。このコードはコンパイラによって自動的に生成され、Cランタイムを初期化します。DLLをP/Invokingすることで、そのコードをバイパスします。
  2. Cygwinは独自のソケットコードを使用します。これは、ネットワークカードと対話するためにいくつかの低レベルのシステムコールを行う必要があります。Cygwinは独自の実装を使用しているため、Windowsランタイムの背後でこれを実行します。

.NETアプリケーションで使用されるネイティブDLLでソケットを使用する場合は、Winsocksを使用して、Microsoftのコンパイラでコンパイルする必要があるため、ネイティブWindowsライブラリに対してリンクされます。

たとえば、これにはVisual Studio 2012 ExpressforDesktopを使用できます。

于 2012-12-19T11:19:53.260 に答える