我获得了已编译为 DLL 的 C 代码。然后,我在 VC++ 中创建了一个包装器,它调用此代码中的函数。到目前为止一切正常。我无法将 C# stringbuilder (char*) 从使用此包装器的 C# 代码传递给 C++ 代码。
到目前为止,我有一个用 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*),应该传递一个 stringbuilder,所以我尝试了:
C#代码:
...
Wrapper wrap = new Wrapper()
...
int bufferSize = 48;
StringBuilder buffer = new StringBuilder(bufferSize);
wrap.ReadStream(buffer, ref bufferSize);
但是代码不会编译,因为 C# 认为函数定义需要 sbyte*。我读过这是因为 C# 字符是 unicode(2 个字节),而 C++ 字符是单字节字符,但建议的解决方案是传递一个 StringBuilder。
我见过很多解决方案,其中 C# 代码将 stringbuilder 直接传递给 DLL,但找不到将 stringbuilder 传递给 C++ 包装类的解决方案。