DLLにコンパイルしたCコードが渡されました。次に、このコードの関数を呼び出すラッパーをVC++で作成しました。この時点まではすべて正常に機能します。このラッパーを使用するC#コードからC ++コードにC#stringbuilder(char *)を渡すのに問題があります。
これまでのところ、次の関数呼び出しを持つVC++で記述されたラッパークラスがあります。
void Wrapper::ReadStream(char* buffer, int* size)
{
int req_sz;
read_stream(opts, req_sz, req, buffer); //This calls the C DLL, this part works.
}
C ++ラッパー関数ReadStreamを呼び出そうとしているときに、C#コードに問題が発生しました。同様の問題を探し回った後、C#からC ++(char *を検索する)に文字列を渡すには、文字列ビルダーを渡す必要があることがわかったので、次のことを試しました。
C#コード:
...
Wrapper wrap = new Wrapper()
...
int bufferSize = 48;
StringBuilder buffer = new StringBuilder(bufferSize);
wrap.ReadStream(buffer, ref bufferSize);
ただし、C#は関数定義をsbyte *が必要であると見なしているため、コードはコンパイルされません。これは、C#文字がユニコード(2バイト)であるのに対し、C ++文字は1バイト文字であるためですが、推奨される解決策はStringBuilderを渡すことです。
C#コードがstringbuilderをDLLに直接渡すソリューションをたくさん見てきましたが、stringbuilderをC++ラッパークラスに渡すソリューションを見つけることができません。