2011-09-14 9 views
0

私はdllのラッパーを作成しています。 dllには、次のようなシグネチャを持つメソッドがあります。aMethodは、すべてのパラメータへの文字列ポインタを返します。引数に二重間接を持つラップされたC++メソッドに対して、C#で署名を書くにはどうすればよいですか?

私はフレームワークがマーシャリングプロセスを行うことができるように、私はC#で署名を書く方法についての洞察を私に与えるためのチュートリアルをGoogleで検索しました。

どのように書き込むことができますか? このテーマに関するチュートリアル、書籍、またはドキュメントについて知っていますか?

+0

あなたは、本質的に、マネージコードからこのメソッドを呼び出すようにしませんか? –

+0

可能な複製[関数へのポインタを引数に持つラップされたC++メソッドのC#で署名を書くにはどうすればよいですか?](http://stackoverflow.com/questions/7410382/how-can-i-write- c-method-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-to-a) –

+0

'char *'は関数へのポインタではありません。私はまた、二重間接を見ません... – dtb

答えて

0

私は答えを得た:

署名は、このようにする必要があり:

[DllImport(aDll.dll, CallingConvention = CallingConvention.Cdecl, 
    CharSet = CharSet.Auto)] 
static unsafe extern ulong aMethod(ref IntPtr firstParameter, 
    ref IntPtr secondParameter); 

パラメータは、ここのように宣言する必要があります。

IntPtr firstParameter = new IntPtr(); 
IntPtr secondParameter = new IntPtr(); 

と呼び出しは次のように行われています

aMethod(ref firstParameter, ref secondParameter); 

マーシャリングと、ここのように文字列に関連した非整列化:

明らか
Marshal.PtrToStringAnsi(firstParameter) 
Marshal.PtrToStringAnsi(secondParameter) 

、このマーシャリングはdll's APIの規則に基づいて選択されています。

- 私のすべての後にわからないが、すべての問題がCharsetCallingConventionオプションで、それらのソースを持っていた...

0

あなたがC#から電話したい.dllにたくさんのメソッドを持っているなら、あなたに役立つツールはありませんが、http://www.swig.orgです。インターフェイスファイルから.dllのラッパーを生成しましょう。それを行う方法を学ぶ一つの方法は、それがいかにしてそれを行うのかを研究することです。

0

は、あなたはそれを使用するには

ulong aMethod(out IntPtr firstParameter, out IntPtr secondParameter); 

としてそれを書くことができません:

IntPtr p1; 
IntPtr p2; 

aMethod(out p1, out p2); 

string p1Str = Marshal.PtrToStringAnsi(p1); 
string p2Str = Marshal.PtrToStringAnsi(p2); 

私はあなたが実際のメモリ上で動作しないことを、もちろん、と仮定していますそのメソッドによって返されます。実際のバイトで操作したい場合は、Marshal.ReadByteを呼び出して、受け取ったポインタを渡すことができます。

呼び出されたメソッドがそれらの文字列を渡す前にそれらの文字列のメモリを割り当てている場合、そのAPIでメモリを解放するために何かを呼び出せない限り、メモリリークが発生することに注意してください。

バイトで直接操作している場合、APIの他の何かがあなたの下から敷物を引き出さないという保証はありません。

+0

ありがとう!私の指針のマーシャリングとアンマーシャリングを使用して私を照らした – JPCF

関連する問題