gpt4 book ai didi

c# - 将 C# 字符串构建器传递给 C DLL 的 C++ 包装器

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:53:40 24 4
gpt4 key购买 nike

我得到了 C 代码,我已将其编译为 DLL。然后我在 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++ 包装器类的解决方案。

最佳答案

您可以将 C# unicode 字符串传递给 std::wstring , 然后在 c++ 代码中你可以转换 std::wstring to std::string并传递给 C-API。

或者您可以使用 Encoding ASCII GetBytes并在 C# 代码中获取 Byte[],将数组传递给 C++,将其转换为空终止字符串并将其传递给 C-API。我可能会选择第二个选项。

关于c# - 将 C# 字符串构建器传递给 C DLL 的 C++ 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13050249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com