Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 56 additions & 41 deletions Il2CppInterop.Runtime/IL2CPP.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ static IL2CPP()
for (var i = 0; i < assembliesCount; i++)
{
var image = il2cpp_assembly_get_image(assemblies[i]);
var name = il2cpp_image_get_name(image);
var name = il2cpp_image_get_name_(image)!;
ourImagesMap[name] = image;
}
}
Expand Down Expand Up @@ -69,7 +69,7 @@ public static IntPtr GetIl2CppField(IntPtr clazz, string fieldName)
var field = il2cpp_class_get_field_from_name(clazz, fieldName);
if (field == IntPtr.Zero)
Logger.Instance.LogError(
"Field {FieldName} was not found on class {ClassName}", fieldName, il2cpp_class_get_name(clazz));
"Field {FieldName} was not found on class {ClassName}", fieldName, il2cpp_class_get_name_(clazz));
return field;
}

Expand All @@ -84,7 +84,7 @@ public static IntPtr GetIl2CppMethodByToken(IntPtr clazz, int token)
if (il2cpp_method_get_token(method) == token)
return method;

var className = il2cpp_class_get_name(clazz);
var className = il2cpp_class_get_name_(clazz);
Logger.Instance.LogTrace("Unable to find method {ClassName}::{Token}", className, token);

return NativeStructUtils.GetMethodInfoForMissingMethod(className + "::" + token);
Expand All @@ -110,7 +110,7 @@ public static IntPtr GetIl2CppMethod(IntPtr clazz, bool isGeneric, string method
IntPtr method;
while ((method = il2cpp_class_get_methods(clazz, ref iter)) != IntPtr.Zero)
{
if (il2cpp_method_get_name(method) != methodName)
if (il2cpp_method_get_name_(method) != methodName)
continue;

if (il2cpp_method_get_param_count(method) != argTypes.Length)
Expand All @@ -120,7 +120,7 @@ public static IntPtr GetIl2CppMethod(IntPtr clazz, bool isGeneric, string method
continue;

var returnType = il2cpp_method_get_return_type(method);
var returnTypeNameActual = il2cpp_type_get_name(returnType);
var returnTypeNameActual = il2cpp_type_get_name_(returnType);
if (returnTypeNameActual != returnTypeName)
continue;

Expand All @@ -131,7 +131,7 @@ public static IntPtr GetIl2CppMethod(IntPtr clazz, bool isGeneric, string method
for (var i = 0; i < argTypes.Length; i++)
{
var paramType = il2cpp_method_get_param(method, (uint)i);
var typeName = il2cpp_type_get_name(paramType);
var typeName = il2cpp_type_get_name_(paramType);
if (typeName != argTypes[i])
{
badType = true;
Expand All @@ -144,19 +144,19 @@ public static IntPtr GetIl2CppMethod(IntPtr clazz, bool isGeneric, string method
return method;
}

var className = il2cpp_class_get_name(clazz);
var className = il2cpp_class_get_name_(clazz);

if (methodsSeen == 1)
{
Logger.Instance.LogTrace(
"Method {ClassName}::{MethodName} was stubbed with a random matching method of the same name", className, methodName);
Logger.Instance.LogTrace(
"Stubby return type/target: {LastMethod} / {ReturnTypeName}", il2cpp_type_get_name(il2cpp_method_get_return_type(lastMethod)), returnTypeName);
"Stubby return type/target: {LastMethod} / {ReturnTypeName}", il2cpp_type_get_name_(il2cpp_method_get_return_type(lastMethod)), returnTypeName);
Logger.Instance.LogTrace("Stubby parameter types/targets follow:");
for (var i = 0; i < argTypes.Length; i++)
{
var paramType = il2cpp_method_get_param(lastMethod, (uint)i);
var typeName = il2cpp_type_get_name(paramType);
var typeName = il2cpp_type_get_name_(paramType);
Logger.Instance.LogTrace(" {TypeName} / {ArgType}", typeName, argTypes[i]);
}

Expand All @@ -171,17 +171,17 @@ public static IntPtr GetIl2CppMethod(IntPtr clazz, bool isGeneric, string method
iter = IntPtr.Zero;
while ((method = il2cpp_class_get_methods(clazz, ref iter)) != IntPtr.Zero)
{
if (il2cpp_method_get_name(method) != methodName)
if (il2cpp_method_get_name_(method) != methodName)
continue;

var nParams = il2cpp_method_get_param_count(method);
Logger.Instance.LogTrace("Method starts");
Logger.Instance.LogTrace(
" return {MethodTypeName}", il2cpp_type_get_name(il2cpp_method_get_return_type(method)));
" return {MethodTypeName}", il2cpp_type_get_name_(il2cpp_method_get_return_type(method)));
for (var i = 0; i < nParams; i++)
{
var paramType = il2cpp_method_get_param(method, (uint)i);
var typeName = il2cpp_type_get_name(paramType);
var typeName = il2cpp_type_get_name_(paramType);
Logger.Instance.LogTrace(" {TypeName}", typeName);
}

Expand Down Expand Up @@ -236,18 +236,13 @@ public static IntPtr GetIl2CppNestedType(IntPtr enclosingType, string nestedType
}

while ((nestedTypePtr = il2cpp_class_get_nested_types(enclosingType, ref iter)) != IntPtr.Zero)
if (il2cpp_class_get_name(nestedTypePtr) == nestedTypeName)
if (il2cpp_class_get_name_(nestedTypePtr) == nestedTypeName)
return nestedTypePtr;

Logger.Instance.LogTrace("Failed to find nested type through enumeration, falling back to reflection");
Logger.Instance.LogError(
"Nested type {NestedTypeName} on {EnclosingTypeName} not found!", nestedTypeName, il2cpp_class_get_name_(enclosingType));

var result = RuntimeReflectionHelper.GetNestedTypeViaReflection(enclosingType, nestedTypeName);

if (result == IntPtr.Zero)
Logger.Instance.LogError(
"Nested type {NestedTypeName} on {EnclosingTypeName} not found!", nestedTypeName, il2cpp_class_get_name(enclosingType));

return result;
return IntPtr.Zero;
}

public static void ThrowIfNull(object arg)
Expand Down Expand Up @@ -518,12 +513,16 @@ public static extern IntPtr il2cpp_class_get_method_from_name(IntPtr klass,
[MarshalAs(UnmanagedType.LPUTF8Str)] string name, int argsCount);

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.LPUTF8Str)]
public static extern string il2cpp_class_get_name(IntPtr klass);
public static extern nint il2cpp_class_get_name(IntPtr klass);

public static string? il2cpp_class_get_name_(IntPtr klass)
=> Marshal.PtrToStringUTF8(il2cpp_class_get_name(klass));

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.LPUTF8Str)]
public static extern string il2cpp_class_get_namespace(IntPtr klass);
public static extern nint il2cpp_class_get_namespace(IntPtr klass);

public static string? il2cpp_class_get_namespace_(IntPtr klass)
=> Marshal.PtrToStringUTF8(il2cpp_class_get_namespace(klass));

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr il2cpp_class_get_parent(IntPtr klass);
Expand Down Expand Up @@ -587,8 +586,10 @@ public static extern IntPtr il2cpp_class_get_method_from_name(IntPtr klass,
public static extern IntPtr il2cpp_class_get_image(IntPtr klass);

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.LPUTF8Str)]
public static extern string il2cpp_class_get_assemblyname(IntPtr klass);
public static extern nint il2cpp_class_get_assemblyname(IntPtr klass);

public static string? il2cpp_class_get_assemblyname_(IntPtr klass)
=> Marshal.PtrToStringUTF8(il2cpp_class_get_assemblyname(klass));

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern int il2cpp_class_get_rank(IntPtr klass);
Expand Down Expand Up @@ -634,8 +635,10 @@ public static extern IntPtr
public static extern int il2cpp_field_get_flags(IntPtr field);

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.LPUTF8Str)]
public static extern string il2cpp_field_get_name(IntPtr field);
public static extern nint il2cpp_field_get_name(IntPtr field);

public static string? il2cpp_field_get_name_(IntPtr field)
=> Marshal.PtrToStringUTF8(il2cpp_field_get_name(field));

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr il2cpp_field_get_parent(IntPtr field);
Expand Down Expand Up @@ -726,8 +729,10 @@ public static extern IntPtr il2cpp_unity_liveness_calculation_begin(IntPtr filte
public static extern IntPtr il2cpp_method_get_declaring_type(IntPtr method);

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.LPUTF8Str)]
public static extern string il2cpp_method_get_name(IntPtr method);
public static extern nint il2cpp_method_get_name(IntPtr method);

public static string? il2cpp_method_get_name_(IntPtr method)
=> Marshal.PtrToStringUTF8(il2cpp_method_get_name(method));

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static IntPtr il2cpp_method_get_from_reflection(IntPtr method)
Expand Down Expand Up @@ -775,8 +780,10 @@ public static IntPtr il2cpp_method_get_from_reflection(IntPtr method)
public static extern uint il2cpp_method_get_token(IntPtr method);

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.LPUTF8Str)]
public static extern string il2cpp_method_get_param_name(IntPtr method, uint index);
public static extern nint il2cpp_method_get_param_name(IntPtr method, uint index);

public static string? il2cpp_method_get_param_name_(IntPtr method, uint index)
=> Marshal.PtrToStringUTF8(il2cpp_method_get_param_name(method, index));

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern void il2cpp_profiler_install(IntPtr prof, IntPtr shutdown_callback);
Expand Down Expand Up @@ -808,8 +815,10 @@ public static IntPtr il2cpp_method_get_from_reflection(IntPtr method)
public static extern IntPtr il2cpp_property_get_set_method(IntPtr prop);

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.LPUTF8Str)]
public static extern string il2cpp_property_get_name(IntPtr prop);
public static extern nint il2cpp_property_get_name(IntPtr prop);

public static string? il2cpp_property_get_name_(IntPtr prop)
=> Marshal.PtrToStringUTF8(il2cpp_property_get_name(prop));

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr il2cpp_property_get_parent(IntPtr prop);
Expand Down Expand Up @@ -952,8 +961,10 @@ public static extern IntPtr il2cpp_runtime_invoke_convert_args(IntPtr method, In
public static extern IntPtr il2cpp_type_get_class_or_element_class(IntPtr type);

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.LPUTF8Str)]
public static extern string il2cpp_type_get_name(IntPtr type);
public static extern nint il2cpp_type_get_name(IntPtr type);

public static string? il2cpp_type_get_name_(IntPtr type)
=> Marshal.PtrToStringUTF8(il2cpp_type_get_name(type));

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.I1)]
Expand All @@ -973,12 +984,16 @@ public static extern IntPtr il2cpp_runtime_invoke_convert_args(IntPtr method, In
public static extern IntPtr il2cpp_image_get_assembly(IntPtr image);

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.LPUTF8Str)]
public static extern string il2cpp_image_get_name(IntPtr image);
public static extern nint il2cpp_image_get_name(IntPtr image);

public static string? il2cpp_image_get_name_(IntPtr image)
=> Marshal.PtrToStringUTF8(il2cpp_image_get_name(image));

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.LPUTF8Str)]
public static extern string il2cpp_image_get_filename(IntPtr image);
public static extern nint il2cpp_image_get_filename(IntPtr image);

public static string? il2cpp_image_get_filename_(IntPtr image)
=> Marshal.PtrToStringUTF8(il2cpp_image_get_filename(image));

[DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr il2cpp_image_get_entry_point(IntPtr image);
Expand Down
2 changes: 1 addition & 1 deletion Il2CppInterop.Runtime/Injection/ClassInjector.Debug.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ private static string ToString(Il2CppClass* il2CppClass)
private static string ToString(Il2CppTypeStruct* il2CppType)
{
if (il2CppType == default) return "null";
return IL2CPP.il2cpp_type_get_name((IntPtr)il2CppType);
return IL2CPP.il2cpp_type_get_name_((IntPtr)il2CppType)!;
}

public static void Dump(Il2CppClass* il2CppClass)
Expand Down
28 changes: 14 additions & 14 deletions Il2CppInterop.Runtime/Injection/ClassInjector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -235,8 +235,8 @@ public static void RegisterTypeInIl2Cpp(Type type, RegisterTypeOptions options)
classPointer.HasFinalize = true;
classPointer.IsVtableInitialized = true;

classPointer.Name = Marshal.StringToHGlobalAnsi(type.Name);
classPointer.Namespace = Marshal.StringToHGlobalAnsi(type.Namespace ?? string.Empty);
classPointer.Name = Marshal.StringToCoTaskMemUTF8(type.Name);
classPointer.Namespace = Marshal.StringToCoTaskMemUTF8(type.Namespace ?? string.Empty);

classPointer.ThisArg.Type = classPointer.ByValArg.Type = Il2CppTypeEnum.IL2CPP_TYPE_CLASS;
classPointer.ThisArg.ByRef = true;
Expand All @@ -257,7 +257,7 @@ public static void RegisterTypeInIl2Cpp(Type type, RegisterTypeOptions options)
for (var i = 0; i < classPointer.FieldCount; i++)
{
var fieldInfo = UnityVersionHandler.Wrap(il2cppFields + i * UnityVersionHandler.FieldInfoSize());
fieldInfo.Name = Marshal.StringToHGlobalAnsi(fieldsToInject[i].Name);
fieldInfo.Name = Marshal.StringToCoTaskMemUTF8(fieldsToInject[i].Name);
fieldInfo.Parent = classPointer.ClassPointer;
fieldInfo.Offset = fieldOffset;

Expand Down Expand Up @@ -347,7 +347,7 @@ static void FindAbstractMethods(List<INativeMethodInfoStruct> list, INativeClass
for (var i = 0; i < klass.MethodCount; i++)
{
var baseMethod = UnityVersionHandler.Wrap(klass.Methods[i]);
var name = Marshal.PtrToStringAnsi(baseMethod.Name)!;
var name = Marshal.PtrToStringUTF8(baseMethod.Name)!;

if (baseMethod.Flags.HasFlag(Il2CppMethodFlags.METHOD_ATTRIBUTE_ABSTRACT))
{
Expand All @@ -357,7 +357,7 @@ static void FindAbstractMethods(List<INativeMethodInfoStruct> list, INativeClass
{
var existing = list.SingleOrDefault(m =>
{
if (Marshal.PtrToStringAnsi(m.Name) != name) return false;
if (Marshal.PtrToStringUTF8(m.Name) != name) return false;
if (m.ParametersCount != baseMethod.ParametersCount) return false;
if (GetIl2CppTypeFullName(m.ReturnType) != GetIl2CppTypeFullName(baseMethod.ReturnType)) return false;

Expand Down Expand Up @@ -416,7 +416,7 @@ INativeMethodInfoStruct HandleAbstractMethod(int position)
baseMethod = HandleAbstractMethod(i);
}

var methodName = Marshal.PtrToStringAnsi(baseMethod.Name);
var methodName = Marshal.PtrToStringUTF8(baseMethod.Name);

if (methodName == "Finalize") // slot number is not static
{
Expand Down Expand Up @@ -465,7 +465,7 @@ INativeMethodInfoStruct HandleAbstractMethod(int position)
for (var j = 0; j < interfaces[i].MethodCount; j++)
{
var vTableMethod = UnityVersionHandler.Wrap(interfaces[i].Methods[j]);
var methodName = Marshal.PtrToStringAnsi(vTableMethod.Name);
var methodName = Marshal.PtrToStringUTF8(vTableMethod.Name);
if (!infos.TryGetValue((methodName, vTableMethod.ParametersCount, vTableMethod.IsGeneric),
out var methodIndex))
{
Expand Down Expand Up @@ -598,7 +598,7 @@ private static bool IsMethodEligible(MethodInfo method)
INativeClassStruct declaringClass)
{
var converted = UnityVersionHandler.NewMethod();
converted.Name = Marshal.StringToHGlobalAnsi(methodName);
converted.Name = Marshal.StringToCoTaskMemUTF8(methodName);
converted.Class = declaringClass.ClassPointer;

Delegate invoker;
Expand Down Expand Up @@ -630,7 +630,7 @@ private static bool IsMethodEligible(MethodInfo method)
internal static Il2CppMethodInfo* ConvertMethodInfo(MethodInfo monoMethod, INativeClassStruct declaringClass)
{
var converted = UnityVersionHandler.NewMethod();
converted.Name = Marshal.StringToHGlobalAnsi(monoMethod.Name);
converted.Name = Marshal.StringToCoTaskMemUTF8(monoMethod.Name);
converted.Class = declaringClass.ClassPointer;

var parameters = monoMethod.GetParameters();
Expand All @@ -645,7 +645,7 @@ private static bool IsMethodEligible(MethodInfo method)
var param = UnityVersionHandler.Wrap(paramsArray[i]);
if (UnityVersionHandler.ParameterInfoHasNamePosToken())
{
param.Name = Marshal.StringToHGlobalAnsi(parameterInfo.Name);
param.Name = Marshal.StringToCoTaskMemUTF8(parameterInfo.Name);
param.Position = i;
param.Token = 0;
}
Expand Down Expand Up @@ -1118,7 +1118,7 @@ private static string GetIl2CppTypeFullName(Il2CppTypeStruct* typePointer)

var fullName = new StringBuilder();

var namespaceName = Marshal.PtrToStringAnsi(klass.Namespace);
var namespaceName = Marshal.PtrToStringUTF8(klass.Namespace);
if (!string.IsNullOrEmpty(namespaceName))
{
fullName.Append(namespaceName);
Expand All @@ -1128,13 +1128,13 @@ private static string GetIl2CppTypeFullName(Il2CppTypeStruct* typePointer)
var declaringType = klass;
while ((declaringType = UnityVersionHandler.Wrap(declaringType.DeclaringType)) != default)
{
fullName.Append(Marshal.PtrToStringAnsi(declaringType.Name));
fullName.Append(Marshal.PtrToStringUTF8(declaringType.Name));
fullName.Append('+');
}

fullName.Append(Marshal.PtrToStringAnsi(klass.Name));
fullName.Append(Marshal.PtrToStringUTF8(klass.Name));

var assemblyName = Marshal.PtrToStringAnsi(assembly.Name.Name);
var assemblyName = Marshal.PtrToStringUTF8(assembly.Name.Name);
if (assemblyName != "mscorlib")
{
fullName.Append(", ");
Expand Down
Loading
Loading