#pragma once #include "il2cpp-vm-support.h" #include "os/WindowsRuntime.h" #include "vm/Exception.h" #include "utils/StringView.h" struct Il2CppIActivationFactory; namespace il2cpp { namespace vm { class LIBIL2CPP_CODEGEN_API WindowsRuntime { public: static Il2CppIActivationFactory* GetActivationFactory(const utils::StringView& runtimeClassName); static inline void CreateHStringReference(const utils::StringView& str, Il2CppHStringHeader* header, Il2CppHString* hstring) { il2cpp_hresult_t hr = os::WindowsRuntime::CreateHStringReference(str, header, hstring); IL2CPP_VM_RAISE_IF_FAILED(hr, false); } static inline Il2CppHString CreateHString(Il2CppString* str) { Il2CppHString result; il2cpp_hresult_t hr = os::WindowsRuntime::CreateHString(utils::StringView(str->chars, str->length), &result); IL2CPP_VM_RAISE_IF_FAILED(hr, false); return result; } static inline Il2CppHString CreateHString(const utils::StringView& str) { Il2CppHString result; il2cpp_hresult_t hr = os::WindowsRuntime::CreateHString(str, &result); IL2CPP_VM_RAISE_IF_FAILED(hr, false); return result; } static inline void DeleteHString(Il2CppHString hstring) { il2cpp_hresult_t hr = os::WindowsRuntime::DeleteHString(hstring); IL2CPP_VM_RAISE_IF_FAILED(hr, false); } static inline Il2CppString* HStringToManagedString(Il2CppHString hstring) { return os::WindowsRuntime::HStringToManagedString(hstring); } static inline void* PreallocateHStringBuffer(uint32_t length, Il2CppNativeChar** buffer) { void* bufferHandle; il2cpp_hresult_t hr = os::WindowsRuntime::PreallocateHStringBuffer(length, buffer, &bufferHandle); IL2CPP_VM_RAISE_IF_FAILED(hr, false); return bufferHandle; } static inline Il2CppHString PromoteHStringBuffer(void* bufferHandle) { Il2CppHString hstring; il2cpp_hresult_t hr = os::WindowsRuntime::PromoteHStringBuffer(bufferHandle, &hstring); if (IL2CPP_HR_FAILED(hr)) { // Prevent memory leaks by deleting the hstring buffer that was supposed to be promoted before raising an exception os::WindowsRuntime::DeleteHStringBuffer(bufferHandle); IL2CPP_VM_RAISE_COM_EXCEPTION(hr, false); } return hstring; } static void MarshalTypeToNative(const Il2CppType* type, Il2CppWindowsRuntimeTypeName& nativeType); static const Il2CppType* MarshalTypeFromNative(Il2CppWindowsRuntimeTypeName& nativeType); static inline void DeleteNativeType(Il2CppWindowsRuntimeTypeName& nativeType) { DeleteHString(nativeType.typeName); } }; } }