私はC DLLを持っています。私はPInvokingしています。主な目的は、abcd-abcd-abcd-abcd-abcd-abcd-abcd-abcd
など、39文字のGUID文字列を取得することです。ユニットテストでStringBuilderを使用してPInvokingする
私が最初に私が39個の文字であることを期待され、この文字列のサイズを取得するには1つのメソッドを呼び出して、そして私は39の容量を持つStringBuilder
を渡し、別の関数を呼び出す:
[DllImport("test.dll")]
public static extern int get_size();
[DllImport("test.dll")]
public static extern void get_string(StringBuilder result);
私のコードabcd-abcd-abcd-abcd-abcd-abcd-abcd-abcd
int size = get_size(); // Returns 40, because it includes the null terminating character.
var result = new StringBuilder(size - 1); // Gives it a capacity of 39. Subtracting 1 here because this does not fancy that null terminator over the marshaling layer.
get_string(result);
Console.WriteLine(result.ToString());
:次のようになります10正確に同じコードで単体テストから呼び出すと、私はこの結果を返します。abcd-abcd-abcd-abcd-abcd-abcd-abcd-abcdq
最後にq
が追加されていることと、追加される余分な文字と、私が確認できる単体テストをデバッグしたことに注意してくださいStringBuilder
オブジェクトの容量が、の後に42 まで大幅に増加したことを示します。容量が39で初期化されていますが、get_string
への呼び出しが行われました。これは正常ですか?私は何か間違っているのですか?なぜ単体テストでしかないのですか?
Cの実装では、このようなものである:これは、いくつかの修正が必要な
static char *_result = NULL; // At some point result is initialized and set.
int get_size() {
if (_result != NULL)
return strlen(_result) + 1;
return 1;
}
void get_string(char *result) {
if (result != NULL && _result != NULL)
strncpy(result, _result, strlen(_result));
}
おそらく、これらの関数のC実装は、いくつかの光を放つかもしれません。あなたはそれを追加できますか? –
@FelixPalmenある瞬間、私はそれを追加します。 – Alexandru
その質問に対する答えは分かりませんが、サイズを一切与えなかったのですか? – jambodev