diff --git a/tdutils/td/utils/port/CxCli.h b/tdutils/td/utils/port/CxCli.h index b7f01fa4..f3891259 100644 --- a/tdutils/td/utils/port/CxCli.h +++ b/tdutils/td/utils/port/CxCli.h @@ -88,8 +88,6 @@ inline String^ string_from_unmanaged(const std::string &from) { #elif TD_CLI -#include - #define REF_NEW gcnew #define CLRCALL __clrcall @@ -118,14 +116,27 @@ inline std::int64_t Increment(std::int64_t %value) { } inline std::string string_to_unmanaged(String^ str) { - if (!str) { + if (!str || str->Length == 0) { return std::string(); } - return msclr::interop::marshal_as(str); + + Array^ bytes = System::Text::Encoding::UTF8->GetBytes(str); + cli::pin_ptr pinned_ptr = &bytes[0]; + std::string result(reinterpret_cast(&pinned_ptr[0]), bytes->Length); + return result; } inline String^ string_from_unmanaged(const std::string &from) { - return msclr::interop::marshal_as(from); + if (from.empty()) { + return String::Empty; + } + + Array^ bytes = REF_NEW Vector(static_cast(from.size())); + cli::pin_ptr pinned_ptr = &bytes[0]; + for (size_t i = 0; i < from.size(); ++i) { + pinned_ptr[i] = from[i]; + } + return System::Text::Encoding::UTF8->GetString(bytes); } } // namespace CxCli