機能に関する問題は、次のようになります。C言語でPInvoke char *がC#でStringとして処理されるDLL。 C DLL内のヌル文字
int my_Funct(char* input, char* output);
私はC#のアプリからこれを呼び出す必要があります。私は次のようにこれを行います:
...DllImport stuff...
public static extern int my_Funct(string input, string output);
入力文字列はDLLに完全に送信されます(私はそれを証明しています)。関数が間違っていても、出力は出力されます。私は次のように、それにヘキサデータを持っている:
3F-D9-00-01
しかし残念ながら二つのゼロの後にあるすべてのものが切断され、最初の2つのバイトは、私のC#のアプリに来ます。それは、(私が推測する)それがヌル文字として扱われ、文字列の終わりとしてそれをとるので、起こります。
どうすればいいですか?私は文字列ではなくIntPtrとして指定しようとしましたが、後でそれをどうするかわかりません。 私は後に実行しようとしました:
byte[] b1 = new byte[2];
Marshal.Copy(output,b1,0,2);
2は、通常、バイト配列の長さでなければなりません。しかし、私はすべての種類のエラーが発生します:「要求された範囲は配列の終わりを過ぎて広がっています。または "保護されたメモリを読み書きしようとしました..."
何か助けていただきありがとうございます。
(1)C#文字列がcharよりも広い。 (2)この関数によって返されるchar *は、正しい幅のものであっても、有効なC#文字列であるために必要な追加構造を持たないでしょう。 –
この操作の実行方法については、COM InteropおよびP/Invokeを参照する必要があります。それを行い、その資料であなたが持っている質問でコールバックしてください。 –
pinvoke marshallerはC文字列のみをサポートします。それは明らかにC文字列ではなく、0の後で重要なバイトを持つときです。それはバイト[]です。しかし、重要なハングアップでは、誰も* *多くの*バイトがどのように関係しているか把握することはできません。この関数は、Cコードでも使用するのが非常に難しく、ピンボケしてもそれほど良くなりません。あなたはそれを修正する方がよいでしょう。長さが予測可能な場合は、MarshalAs.SizeConstを使用します。 –