0

ACスタティックライブラリからいくつかの関数を呼び出すのにまだ苦労しています。このtomsラッパーの後に Visual Studio を使用して静的ライブラリの周りにラッパーを作成し、C# 側の関数にアクセスできるようになりましたが、それらを処理するときにいくつかのエラーが発生します。

したがって、関数が元のように見えるのは次のとおりです。

ZEXTERN Int32 ZEXPORT compressZIP OF((unsigned char *dest,   Uint32 destLen,
                             unsigned char *source, Uint32 sourceLen,
                             Uint32 *_crc32));

その結果、C#側で

public int compressZIP(byte* dest, uint destLen, byte* source, uint sourceLen,
                            uint* _crc32);

だから、今私はポインターの問題で立ち往生しています、私は次のようなものを試しました

byte[] data = new byte[size]
(fixed ptr = data)

そしてptrsを関数に渡します。しかし、私は常にメモリ違反やその他のメモリ例外が発生します。

少し同じように見えるuncompressZIPを呼び出すと、圧縮されていない2文字が正しく取得されますが、フェンスのものだけが得られます。

誰かが関数に正しい引数を入力するのを手伝ってくれますか?

4

1 に答える 1

1

C# 側ではポインターとして宣言しないでください。バイト配列として宣言してください。そして必ずOutAttributeを含めてください。

実際の例:

[DllImport("PixelFlowIE.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "PixelFlow")]
private static extern void PixelFlowDLL([In, Out] Node[] gi, int width, int height, SourceInfo[] sources, int sourceCount, int iterations, int iterPerPeriod, ProgressCallback prg);
于 2012-04-26T16:09:03.700 に答える