2011-01-05 4 views
0

私はC DLLからC#に関数をインポートしようとしています。 C#のインポートはC#では、このC#dllインポート関数が正しく

[DllImport("sslib32.dll", CharSet = CharSet.Ansi, SetLastError = true)] 
private static extern ushort write_buffer(ushort deviceNumber, ushort wordCount, UInt32 bufferLink, IntPtr buffer) 

のように見えるのC関数はこの

unsigned short write_buffer(unsigned short device_number, unsigned short word_count, unsigned long buffer_link, unsigned short* buffer) 

私の試みのように見える私は、この関数に渡したいメッセージの辞書を持っています。ディクショナリは次のようになります。

Dictionary<string, List<ushort>> msgs 

msgsをバッファに渡すための適切な呼び出しを行う方法を少し混乱させます。 deviceNumberが2であるので、私は、コールがこの

write_buffer(2,32,0, msgs[key]); 

は明らかに私がのIntPtrに対して無効な引数を取得していますようになるはずです知っているWORDCOUNTは32で、buffLinkは0です。この呼び出しを行う適切な方法は何ですか?

答えて

2

バッファーには、そのデータがどの方向に流れるべきかがはっきりしていません。あなたの辞書はそれが配列であることを示唆しています。そのように宣言してください:

private static extern ushort write_buffer(.., ushort[] buffer); 

そしてmsgs [key] .ToArray()を呼び出してください。

write_buffer()呼び出しで定数を使用しても、それほどのシナリオはありませんが、msgs [key] .Countがどこかにあるはずです。

+0

おかげで、申し訳ありませんが質問は少し不明だったが、あなたが提供した答えは正しく動作しているようだ。 – poco

1

hereと呼ばれるP/Invoke Interop Assistantツールを使用して、P/Invokeシグネチャを生成できます。 MSDN マガジンの2008年1月号で

、李チャンとXiaoying郭 は、管理対象と アンマネージコード間でマーシャリングにCLRインサイドアウトの列 を公開しています。このコラムでは アシスタント、自動GUI、および を(両方向で) シグネチャに変換するためのコマンドラインユーティリティを紹介します。この の変換はもちろん、Windowsシグネチャに限定されません。 ツールに独自のCヘッダー ファイルのスニペットを与えて、忠実に をそれらをきれいに印刷されたC# [DllImport]に変換します。

+0

ここでは役に立ちません。このツールは、C宣言にSALアノテーションがある場合にのみ適切なジョブを実行できます。ここでは利用できません。配列であるかどうかを判断する方法はありません。 –

0

あなたが危険なコードをマーキング気にしない場合は、単に行うことができます。

fixed(ushort* pData = msgs[key]) 
{ 
    write_buffer(2,32,0, pData); 
} 

そして、最後の引数として* USHORT取るためにあなたのDLLIMPORTを宣言。

代わりにMarshal.StructureToPtrを使用して、配列を固定メモリにマーシャルすることができます。これには、最初にAllocHGlobalを使用してメモリを割り当て、FreeHGlobalを使用して解放する必要があります。

関連する問題