如何使用 Il2CppInspector 在 C++ 中将 std::string 转换为 System.String?

How do I convert a std::string to System.String in C++ with Il2CppInspector?

我正在使用 Il2CppInspector 为 Unity 游戏生成脚手架。我可以使用下面提供的函数将 System.String(Il2CppInspector 中的 app::String)转换为 std::string

我将如何逆转这个过程;如何将 std::string 转换为 System.String

helpers.cpp

    // Helper function to convert Il2CppString to std::string
    std::string il2cppi_to_string(Il2CppString* str) {
        std::u16string u16(reinterpret_cast<const char16_t*>(str->chars));
        return std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.to_bytes(u16);
    }
    // Helper function to convert System.String to std::string
    std::string il2cppi_to_string(app::String* str) {
        return il2cppi_to_string(reinterpret_cast<Il2CppString*>(str));
    }

简而言之,我正在寻找一个接受 std::string 和 returns 以及 app::String

的函数
    // Helper function to convert std::string to System.String
    app::String string_to_il2cppi(std::string str) {
        // Conversion code here
    }

使用所有命名空间导出 Il2CppInspector,这将使您能够访问 Marshal_PtrToStringAnsi

app::String* string_to_il2cppi(std::string str) {
    return app::Marshal_PtrToStringAnsi((void*)&str, NULL);
}

限制:不要尝试转换其中包含空终止符的字符串示例:

std::string test = "Hello[=11=]world";

如果这对您来说是个问题,请使用 BullyWiiPlaza 的解决方案。

接受的答案实际上是错误的,根据 MSDN documentation.

,没有大小参数并且复制在第一个空字节 (0x00) 处停止

以下代码修复了这些问题并正常工作:

app::String* string_to_il2cppi(const std::string& string)
{
    const auto encoding = (*app::Encoding__TypeInfo)->static_fields->utf8Encoding;

    const auto managed_string = app::String_CreateStringFromEncoding((uint8_t*)&string.at(0), string.size(), encoding, nullptr);

    return managed_string;
}

A quote from djkaty:

To create a string, you cannot use System.String‘s constructors – these are redirected to icalls that throw exceptions. Instead, you should use the internal Mono function String.CreateString. This function has many overloads accepting various types of pointer and array; an easy one to use accepts a uint16_t* to a Unicode string and can be called as follows [...]