我被赋予了编译为DLL的C代码。然后我用VC++创建了一个包装器,它在这段代码中调用函数。到目前为止,一切正常。我无法将C#stringbuilder(char *)从使用此包装的C#代码传递到C++代码。将C#字符串构建器传递给C DLL的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#代码中的问题,而试图调用C++封装函数ReadStream
。四处寻找类似的问题后,我发现,为了从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#代码直接将字符串构建器传递给DLL,但无法找到将字符串构建器传递给C++包装类的解决方案。
是否有某个库需要导入才能使用LPWSTR? – sdm350
@Azkar LPWSTR只是'const wchar_t *'的同义词(它在''中定义)。 –
user1610015
Gotcha。谢谢你的回答,我实际上最终走向了一个不同的方向,虽然我实际上并不想用unicode字符来填充缓冲区,我通过网络接收的数据只是带符号的字符(一个字节) 。我最终发送了C++一个sbyte缓冲区指针,该指针适用于我想要执行的操作。我考虑过COM的建议,但现在根本没有时间去改变它,而且我们有一些其他的包装工具可以这样工作。 – sdm350