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
16 changes: 16 additions & 0 deletions .codacy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Codacy configuration file
# Only scan JEngine code, ignore 3rd party packages and samples

exclude_paths:
# Ignore all 3rd party packages
- "UnityProject/Packages/**"
# Ignore samples
- "UnityProject/Assets/Samples/**"
# Ignore HybridCLR generated code
- "UnityProject/Assets/HybridCLRGenerate/**"
# Ignore Obfuz (3rd party obfuscation tool)
- "UnityProject/Assets/Obfuz/**"

include_paths:
# But include JEngine packages
- "UnityProject/Packages/com.jasonxudeveloper.jengine*/**"

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{
"versions": [
{
"unity_version":"2019",
"hybridclr" : { "branch":"v8.9.0"},
"il2cpp_plus": { "branch":"v2019-8.9.0"}
},
{
"unity_version":"2020",
"hybridclr" : { "branch":"v8.9.0"},
"il2cpp_plus": { "branch":"v2020-8.9.0"}
},
{
"unity_version":"2021",
"hybridclr" : { "branch":"v8.9.0"},
"il2cpp_plus": { "branch":"v2021-8.1.0"}
},
{
"unity_version":"2022",
"hybridclr" : { "branch":"v8.9.0"},
"il2cpp_plus": { "branch":"v2022-8.2.0"}
},
{
"unity_version":"2022-tuanjie",
"hybridclr" : { "branch":"v8.9.0"},
"il2cpp_plus": { "branch":"v2022-tuanjie-8.9.0"}
},
{
"unity_version":"2023",
"hybridclr" : { "branch":"v8.9.0"},
"il2cpp_plus": { "branch":"v2023-8.1.0"}
},
{
"unity_version":"6000",
"hybridclr" : { "branch":"v8.9.0"},
"il2cpp_plus": { "branch":"v6000-8.7.0"}
},
{
"unity_version":"6000.3.x",
"hybridclr" : { "branch":"v6000.3.x-8.9.0"},
"il2cpp_plus": { "branch":"v6000.3.x-8.9.0"}
}
]
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -20,75 +20,84 @@

public static bool DisableMethodBridgeDevelopmentFlagChecking { get; set; }

public void OnPreprocessBuild(BuildReport report)
{
HybridCLRSettings globalSettings = SettingsUtil.HybridCLRSettings;
if (!globalSettings.enable || globalSettings.useGlobalIl2cpp)
{
string oldIl2cppPath = Environment.GetEnvironmentVariable("UNITY_IL2CPP_PATH");
if (!string.IsNullOrEmpty(oldIl2cppPath))
{
Environment.SetEnvironmentVariable("UNITY_IL2CPP_PATH", "");
Debug.Log($"[CheckSettings] clean process environment variable: UNITY_IL2CPP_PATH, old vlaue:'{oldIl2cppPath}'");
}
}
else
{
string curIl2cppPath = Environment.GetEnvironmentVariable("UNITY_IL2CPP_PATH");
if (curIl2cppPath != SettingsUtil.LocalIl2CppDir)
{
Environment.SetEnvironmentVariable("UNITY_IL2CPP_PATH", SettingsUtil.LocalIl2CppDir);
Debug.Log($"[CheckSettings] UNITY_IL2CPP_PATH old value:'{curIl2cppPath}', new value:'{SettingsUtil.LocalIl2CppDir}'");
}
}
if (!globalSettings.enable)
{
return;
}
BuildTargetGroup buildTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget);
#if UNITY_6000_0_OR_NEWER
NamedBuildTarget namedBuildTarget = NamedBuildTarget.FromBuildTargetGroup(buildTargetGroup);
ScriptingImplementation curScriptingImplementation = PlayerSettings.GetScriptingBackend(namedBuildTarget);
#else
ScriptingImplementation curScriptingImplementation = PlayerSettings.GetScriptingBackend(buildTargetGroup);
#endif
ScriptingImplementation targetScriptingImplementation = ScriptingImplementation.IL2CPP;
if (curScriptingImplementation != targetScriptingImplementation)
{
Debug.LogError($"[CheckSettings] current ScriptingBackend:{curScriptingImplementation},have been switched to:{targetScriptingImplementation} automatically");
#if UNITY_6000_0_OR_NEWER
PlayerSettings.SetScriptingBackend(namedBuildTarget, targetScriptingImplementation);
#else
PlayerSettings.SetScriptingBackend(buildTargetGroup, targetScriptingImplementation);
#endif
}

var installer = new Installer.InstallerController();
if (!installer.HasInstalledHybridCLR())
{
throw new BuildFailedException($"You have not initialized HybridCLR, please install it via menu 'HybridCLR/Installer'");
}

if (installer.PackageVersion != installer.InstalledLibil2cppVersion)
{
throw new BuildFailedException($"You must run `HybridCLR/Installer` after upgrading package");
}

HybridCLRSettings gs = SettingsUtil.HybridCLRSettings;
if (((gs.hotUpdateAssemblies?.Length + gs.hotUpdateAssemblyDefinitions?.Length) ?? 0) == 0)
{
Debug.LogWarning("[CheckSettings] No hot update modules configured in HybridCLRSettings");
}

if (!DisableMethodBridgeDevelopmentFlagChecking)
{
string methodBridgeFile = $"{SettingsUtil.GeneratedCppDir}/MethodBridge.cpp";
var match = Regex.Match(File.ReadAllText(methodBridgeFile), @"// DEVELOPMENT=(\d)");
if (match.Success)
{
int developmentFlagInMethodBridge = int.Parse(match.Groups[1].Value);
int developmentFlagInEditorSettings = EditorUserBuildSettings.development ? 1 : 0;
if (developmentFlagInMethodBridge != developmentFlagInEditorSettings)
{
Debug.LogError($"[CheckSettings] MethodBridge.cpp DEVELOPMENT flag:{developmentFlagInMethodBridge} is inconsistent with EditorUserBuildSettings.development:{developmentFlagInEditorSettings}. Please run 'HybridCLR/Generate/All' before building.");
}
}
else
{
Debug.LogError("[CheckSettings] MethodBridge.cpp DEVELOPMENT flag not found. Please run 'HybridCLR/Generate/All' before building.");
}
}
}
}

Check notice on line 102 in UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/BuildProcessors/CheckSettings.cs

View check run for this annotation

codefactor.io / CodeFactor

UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/BuildProcessors/CheckSettings.cs#L23-L102

Complex Method
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
using System.Threading.Tasks;
using UnityEditor;
using UnityEngine;
using static UnityEngine.Networking.UnityWebRequest;

namespace HybridCLR.Editor.Commands
{
Expand Down Expand Up @@ -142,7 +141,7 @@
};

var report = BuildPipeline.BuildPlayer(buildPlayerOptions);

Check notice on line 144 in UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/Commands/StripAOTDllCommand.cs

View check run for this annotation

codefactor.io / CodeFactor

UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/Commands/StripAOTDllCommand.cs#L144

Code should not contain multiple blank lines in a row. (SA1507)


if (report.summary.result != UnityEditor.Build.Reporting.BuildResult.Succeeded)
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#if UNITY_6000_3_OR_NEWER && UNITY_EDITOR_OSX
#define NEW_IL2CPP_PATH
#endif
using System;
using System.Collections.Generic;
using System.IO;
Expand All @@ -8,9 +11,10 @@
using System.Text.RegularExpressions;
using System.Linq;
using HybridCLR.Editor.Settings;
using System.Runtime.InteropServices;

namespace HybridCLR.Editor.Installer
{

Check notice on line 17 in UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/Installer/InstallerController.cs

View check run for this annotation

codefactor.io / CodeFactor

UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/Installer/InstallerController.cs#L17

An opening brace should not be followed by a blank line. (SA1505)

public class InstallerController
{
Expand All @@ -33,7 +37,15 @@
{
_curVersion = ParseUnityVersion(Application.unityVersion);
_versionManifest = GetHybridCLRVersionManifest();
_curDefaultVersion = _versionManifest.versions.FirstOrDefault(v => _curVersion.isTuanjieEngine ? v.unity_version == $"{_curVersion.major}-tuanjie" : v.unity_version == _curVersion.major.ToString());
_curDefaultVersion = _versionManifest.versions.FirstOrDefault(v => {
return _curVersion.isTuanjieEngine? v.unity_version == $"{_curVersion.major}-tuanjie"
#if UNITY_6000_3_OR_NEWER
: v.unity_version == "6000.3.x"
#else
: v.unity_version == _curVersion.major.ToString()
#endif
;
});
PackageVersion = LoadPackageInfo().version;
InstalledLibil2cppVersion = ReadLocalVersion();
}
Expand All @@ -49,7 +61,7 @@
string packageJson = $"{SettingsUtil.ProjectDir}/Packages/{SettingsUtil.PackageName}/package.json";
return JsonUtility.FromJson<PackageInfo>(File.ReadAllText(packageJson, Encoding.UTF8));
}

Check notice on line 64 in UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/Installer/InstallerController.cs

View check run for this annotation

codefactor.io / CodeFactor

UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/Installer/InstallerController.cs#L64

Code should not contain multiple blank lines in a row. (SA1507)

[Serializable]
class PackageInfo
Expand Down Expand Up @@ -109,7 +121,7 @@
int major = int.Parse(match.Groups[1].Value);
int minor1 = int.Parse(match.Groups[2].Value);
int minor2 = int.Parse(match.Groups[3].Value);
bool isTuanjieEngine = versionStr.Contains("t");

Check notice on line 124 in UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/Installer/InstallerController.cs

View check run for this annotation

codefactor.io / CodeFactor

UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/Installer/InstallerController.cs#L124

Use 'string.Contains(char)' instead of 'string.Contains(string)' when searching for a single character. (CA1847)
return new UnityVersion { major = major, minor1 = minor1, minor2 = minor2, isTuanjieEngine = isTuanjieEngine };
}

Expand All @@ -127,7 +139,11 @@
case 2021: return "2021.3.0";
case 2022: return "2022.3.0";
case 2023: return "2023.2.0";
#if UNITY_6000_3_OR_NEWER
case 6000: return "6000.3.0";
#else
case 6000: return "6000.0.0";
#endif
default: return $"2020.3.0";
}
}
Expand Down Expand Up @@ -158,14 +174,28 @@

public string Il2cppPlusLocalVersion => _curDefaultVersion?.il2cpp_plus?.branch;


private string GetIl2CppPathByContentPath(string contentPath)
public string ApplicationIl2cppPath
{
return $"{contentPath}/il2cpp";
get
{
Debug.Log($"application path:{EditorApplication.applicationPath} {EditorApplication.applicationContentsPath}");
#if NEW_IL2CPP_PATH
#if UNITY_IOS
string platformDirName = "iOSSupport";
#elif UNITY_TVOS
string platformDirName = "AppleTVSupport";
#elif UNITY_VISIONOS
string platformDirName = "VisionOSPlayer";
#else
string platformDirName = "iOSSupport";
#endif
return $"{EditorApplication.applicationContentsPath}/../../PlaybackEngines/{platformDirName}/il2cpp";
#else
return $"{EditorApplication.applicationContentsPath}/il2cpp";
#endif
}
}

public string ApplicationIl2cppPath => GetIl2CppPathByContentPath(EditorApplication.applicationContentsPath);

public string LocalVersionFile => $"{SettingsUtil.LocalIl2CppDir}/libil2cpp/hybridclr/generated/libil2cpp-version.txt";

private string ReadLocalVersion()
Expand Down Expand Up @@ -266,12 +296,23 @@
// create LocalIl2Cpp
string localUnityDataDir = SettingsUtil.LocalUnityDataDir;
BashUtil.RecreateDir(localUnityDataDir);

#if !NEW_IL2CPP_PATH
// copy MonoBleedingEdge
BashUtil.CopyDir($"{Directory.GetParent(editorIl2cppPath)}/MonoBleedingEdge", $"{localUnityDataDir}/MonoBleedingEdge", true);

#endif
// copy il2cpp
BashUtil.CopyDir(editorIl2cppPath, SettingsUtil.LocalIl2CppDir, true);
#if NEW_IL2CPP_PATH
string buildDir = $"{SettingsUtil.LocalIl2CppDir}/build";
if (RuntimeInformation.ProcessArchitecture == Architecture.Arm || RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
{
BashUtil.CopyDir($"{buildDir}/deploy_arm64", $"{buildDir}/deploy", false);
}
else
{
BashUtil.CopyDir($"{buildDir}/deploy_x86_64", $"{buildDir}/deploy", false);
}
#endif

// replace libil2cpp
string dstLibil2cppDir = $"{SettingsUtil.LocalIl2CppDir}/libil2cpp";
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -182,57 +182,57 @@
_adjustThunkMethodSet.Add(method);
}

private void ProcessMethod(MethodDef method, List<TypeSig> klassInst, List<TypeSig> methodInst)
{
if (method.IsPrivate || (method.IsAssembly && !method.IsPublic && !method.IsFamily))
{
if (klassInst == null && methodInst == null)
{
return;
}
else
{
//Debug.Log($"[PreservedMethod] method:{method}");
}
}
ICorLibTypes corLibTypes = method.Module.CorLibTypes;
TypeSig returnType;
List<TypeSig> parameters;
if (klassInst == null && methodInst == null)
{
if (method.HasGenericParameters)
{
throw new Exception($"[PreservedMethod] method:{method} has generic parameters");
}
returnType = MetaUtil.ToShareTypeSig(corLibTypes, method.ReturnType);
parameters = method.Parameters.Select(p => MetaUtil.ToShareTypeSig(corLibTypes, p.Type)).ToList();
}
else
{
var gc = new GenericArgumentContext(klassInst, methodInst);
returnType = MetaUtil.ToShareTypeSig(corLibTypes, MetaUtil.Inflate(method.ReturnType, gc));
parameters = method.Parameters.Select(p => MetaUtil.ToShareTypeSig(corLibTypes, MetaUtil.Inflate(p.Type, gc))).ToList();
}

var m2nMethod = CreateMethodDesc(method, false, returnType, parameters);
AddManaged2NativeMethod(m2nMethod);

if (method.IsVirtual)
{
if (method.DeclaringType.IsInterface)
{
AddAdjustThunkMethod(m2nMethod);
}
//var adjustThunkMethod = CreateMethodDesc(method, true, returnType, parameters);
AddNative2ManagedMethod(m2nMethod);
}
if (method.Name == "Invoke" && method.DeclaringType.IsDelegate)
{
var openMethod = CreateMethodDesc(method, true, returnType, parameters);
AddNative2ManagedMethod(openMethod);
}
}

Check notice on line 235 in UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs

View check run for this annotation

codefactor.io / CodeFactor

UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs#L185-L235

Complex Method
private void PrepareMethodBridges()
{
foreach (var method in _genericMethods)
Expand Down Expand Up @@ -263,7 +263,7 @@
}
}
}

Check notice on line 266 in UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs

View check run for this annotation

codefactor.io / CodeFactor

UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs#L266

Code should not contain multiple blank lines in a row. (SA1507)

private List<MethodDesc> _managed2NativeMethodList0;
private List<MethodDesc> _native2ManagedMethodList0;
Expand All @@ -281,7 +281,7 @@

_adjustThunkMethodList0 = _adjustThunkMethodSet.ToList();
_adjustThunkMethodList0.Sort((a, b) => string.CompareOrdinal(a.Sig, b.Sig));

Check notice on line 284 in UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs

View check run for this annotation

codefactor.io / CodeFactor

UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs#L284

Code should not contain multiple blank lines in a row. (SA1507)

var structTypeSet = new HashSet<TypeInfo>();
CollectStructDefs(_managed2NativeMethodList0, structTypeSet);
Expand Down Expand Up @@ -320,7 +320,7 @@
private readonly Dictionary<TypeInfo, AnalyzeTypeInfo> _analyzeTypeInfos = new Dictionary<TypeInfo, AnalyzeTypeInfo>();

private readonly Dictionary<string, TypeInfo> _signature2Type = new Dictionary<string, TypeInfo>();

Check notice on line 323 in UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs

View check run for this annotation

codefactor.io / CodeFactor

UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs#L323

Code should not contain multiple blank lines in a row. (SA1507)


private bool IsBlittable(TypeSig typeSig)
Expand Down Expand Up @@ -538,7 +538,7 @@
}
return methodMap.Values.ToList();
}

Check notice on line 541 in UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs

View check run for this annotation

codefactor.io / CodeFactor

UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs#L541

Code should not contain multiple blank lines in a row. (SA1507)


private static string MakeReversePInvokeSignature(MethodDesc desc, CallingConvention CallingConventionention)
Expand All @@ -559,6 +559,11 @@
{
return CallingConvention.Winapi;
}
if (monoPInvokeCallbackAttr.ConstructorArguments.Count == 0)
{
Debug.LogError($"MonoPInvokeCallbackAttribute on method {method.FullName} has no constructor arguments. Using CallingConvention.Winapi as default.");
return CallingConvention.Winapi;
}
object delegateTypeSig = monoPInvokeCallbackAttr.ConstructorArguments[0].Value;

TypeDef delegateTypeDef;
Expand All @@ -580,7 +585,7 @@
throw new NotSupportedException($"Unsupported delegate type: {delegateTypeSig}");
}
var attr = delegateTypeDef.CustomAttributes.FirstOrDefault(ca => ca.AttributeType.FullName == "System.Runtime.InteropServices.UnmanagedFunctionPointerAttribute");
if (attr == null)
if (attr == null || attr.ConstructorArguments.Count == 0)
{
return CallingConvention.Winapi;
}
Expand Down Expand Up @@ -725,7 +730,7 @@
GenerateManaged2NativeFunctionPointerMethod(method, lines);
}
GenerateManaged2NativeFunctionPointerMethodStub(_callidMethods, lines);

Check notice on line 733 in UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs

View check run for this annotation

codefactor.io / CodeFactor

UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs#L733

Code should not contain multiple blank lines in a row. (SA1507)

frr.Replace("CODE", string.Join("\n", lines));

Expand Down Expand Up @@ -817,7 +822,7 @@
}
}

}

Check notice on line 825 in UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs

View check run for this annotation

codefactor.io / CodeFactor

UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs#L825

A closing brace should not be preceded by a blank line. (SA1508)
if (method.ReturnInfo.Type.IsStruct)
{
structTypes.Add(method.ReturnInfo.Type);
Expand All @@ -828,7 +833,7 @@
}
}

}

Check notice on line 836 in UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs

View check run for this annotation

codefactor.io / CodeFactor

UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs#L836

A closing brace should not be preceded by a blank line. (SA1508)

private void CollectStructDefs(List<MethodSig> methods, HashSet<TypeInfo> structTypes)
{
Expand All @@ -848,7 +853,7 @@
}
}

}

Check notice on line 856 in UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs

View check run for this annotation

codefactor.io / CodeFactor

UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs#L856

A closing brace should not be preceded by a blank line. (SA1508)
var returnType = GetSharedTypeInfo(MetaUtil.ToShareTypeSig(corLibTypes, method.RetType));
if (returnType.IsStruct)
{
Expand All @@ -860,7 +865,7 @@
}
}

}

Check notice on line 868 in UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs

View check run for this annotation

codefactor.io / CodeFactor

UnityProject/Packages/com.code-philosophy.hybridclr@8.9.0/Editor/MethodBridge/Generator.cs#L868

A closing brace should not be preceded by a blank line. (SA1508)

class FieldInfo
{
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,5 +1,47 @@
# ReleaseLog

## 8.9.0

Release Date: 2026-01-12.

### Runtime

- [fix] **Unity 6.3.x**: fix bug that didn't handle interpreter type in GlobalMetadata::GetNestedTypes
- [fix] **Unity 6.3.x**: fix crash on GlobalMetadata::GetMethodHandleFromMethodInfo because it maybe passed null as methodInfo in setup vtable.
- [fix] **TUANJIE**: fix IL2CPP_ASSERT fail in Class::GetVirtualMethod when klass is generic class and not initialized, at this time klass->vtable_count == 0
- [fix] **TUANJIE**: fix the bug that didn't initialize method->klass->rgctx_data after GenericMetadata::InflateRGCTXMethod
- [change] **TUANJIE**: [merge] merge il2cpp changes from tuanjie 1.6.7 to 1.6.8

## 8.8.0

Release Date: 2025-12-14.

### Runtime

- [new] support 6000.3.x
- [new] add instructions for ldfld and stfld while field offset >= 2^16
- [fix] fix offset overflow issue for ldflda, ldfld, stfld while offset >= 2^16
- [fix] fix bug of comparing array rank

### Editor

- [new] support 6000.3.x
- [fix] fix deprecated warning of `PlayerSettings.GetScriptingBackend(BuildTargetGroup)` in Unity 6000

## 8.7.0

Release Date: 2025-11-03.

### Runtime

- [fix] fix a crash issue in IH_object_ctor caused by `ctx.GetCurbb()->insts` may be empty in obfuscated code
- [merge] **Unity 6000***: merge il2cpp changes from 6000.0.44 to 6000.0.60
- [merge] **TuanJie**: merge il2cpp changes from tuanjie 1.6.5 to 1.6.7

### Editor

- [fix] fix raising NullReferenceException in generating MethodBridge for MonoPInvokeCallbackAttribute while constructor arguments is empty.

## 8.6.0

Release Date: 2025-09-27.
Expand Down
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "com.code-philosophy.hybridclr",
"version": "8.6.0",
"version": "8.9.0",
"displayName": "HybridCLR",
"description": "HybridCLR is a fully featured, zero-cost, high-performance, low-memory solution for Unity's all-platform native c# hotupdate.",
"category": "Scripting",
Expand Down