2012-04-26 9 views
0

静的ライブラリからいくつかの関数を呼び出す際に苦労しています。 このtoms wrapperの後にスタティックライブラリのビジュアルスタジオでラッパーを書いて、C#側の関数にアクセスできるようになりましたが、扱う際にエラーが発生します。だからここ静的CライブラリのポインタにC#配列をマーシャリングする

機能は、オリジナルに見えるものです:

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

にC#の側になった

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

が、今私は、ポインタの問題に引っかかっています、私のようなものを試してみました

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

そして関数にptrsを渡します。しかし、私はいつもいくつかのメモリ違反や他のメモリ例外で終わる。

私はuncompressZIPを同じように見えると言いますが、2文字は圧縮されていませんが、その後はフェンスのものだけが得られます。

関数に正しい引数を入力するのに役立つ人はいますか?

答えて

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); 
+0

can't it'sは、C/CLIおよび無DLLIMPORTを管理しているため。 – Gobliins

+0

しかし、とにかく問題はc側にあるようです – Gobliins