0

C# からの C DLL の呼び出しに問題があります。

C関数は(私はこれのためのacヘッダーや良い仕様を持っていません:()

int knr12_read ( char *kn12, char *ik9, char *wok, char *wlc,
char *plz, char *ort, char *woz ); 

kn12 は参照パラメータです

これは私がC#で試したことです

 [return: MarshalAs(UnmanagedType.U4)]
 [DllImport("Knr12.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "knr12_read", CharSet = CharSet.Ansi)] 
unsafe public static extern int knr12_read(out IntPtr buffer, string ik9, string wok, string wlc, string plz, string ort, string woz);

int knr = knr12_read(out pBuffer, knrTemp, "11111", "", "98529", "Suhl", "1");

string data = Marshal.PtrToStringAnsi(pBuffer);

返される int は常に正しいはずですが、ref パラメータ pBuffer に問題があります...

また、他の変数の文字列タイプも機能しています...

を使用するrefと、常に が取得されAccessViolation error knr12_read()ます。使用するoutとポインターが取得されますが、文字列は常に空であり、そうすることはStringできrefませchar*ん。AccessViolation errorknr12_read()

ガイドしてください。

4

2 に答える 2

3

StringBuilder多くの場合、文字列を返すパラメーターを持つ関数を P/Invoking するときに使用するのに適した型です。

static extern int knr12_read(StringBuilder kn12, ...)

関数を呼び出す前に、次のように文字列ビルダーを初期化する必要があります。

StringBuilder outString = new StringBuilder(100);

「unsafe」は必要ありません。また、「C」コードが呼び出しの期間よりも長くポインターを保持しない限り、ピン留めについて心配する必要はありません。フレームワークがそれを行っています。

ここに役立つはずのSOの質問があります: Marshal "char *" in C#

于 2012-10-19T13:41:29.670 に答える