From 5270f307b9c4213ab2068a8f9af212b8cf038f04 Mon Sep 17 00:00:00 2001 From: walon Date: Tue, 29 Nov 2022 09:23:24 +0800 Subject: [PATCH 01/19] =?UTF-8?q?[change]=20il2cpp=5Fplus=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E6=96=B0=E7=9A=84=E5=88=86=E6=94=AF=E5=90=8D=202019-m?= =?UTF-8?q?ain=E3=80=812020-main=E3=80=812021-main=EF=BC=8C=E7=9B=B8?= =?UTF-8?q?=E5=BA=94=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81=20[opt]=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96installer=E7=9A=84=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Installer/InstallerController.cs | 30 ++++++++----------------- Editor/Installer/InstallerWindow.cs | 17 ++------------ package.json | 2 +- 3 files changed, 12 insertions(+), 37 deletions(-) diff --git a/Editor/Installer/InstallerController.cs b/Editor/Installer/InstallerController.cs index 1ca6586..2bcac40 100644 --- a/Editor/Installer/InstallerController.cs +++ b/Editor/Installer/InstallerController.cs @@ -49,19 +49,7 @@ namespace HybridCLR.Editor.Installer private string GetIl2CppPlusBranchByUnityVersion(string unityVersion) { - if (unityVersion.Contains("2019.")) - { - return "2019.4.40"; - } - if (unityVersion.Contains("2020.")) - { - return "2020.3.33"; - } - if (unityVersion.Contains("2021.")) - { - return "2021.3.1"; - } - return "not support"; + return unityVersion.Split('.')[0]; } public string Il2CppBranch => GetIl2CppPlusBranchByUnityVersion(Application.unityVersion); @@ -108,9 +96,9 @@ namespace HybridCLR.Editor.Installer { switch(branch) { - case "2019.4.40": return $"2019.4.{min2019_4_CompatibleMinorVersion}"; - case "2020.3.33": return $"2020.3.{min2020_3_CompatibleMinorVersion}"; - case "2021.3.1": return $"2021.3.{min2021_3_CompatibleMinorVersion}"; + case "2019": return $"2019.4.{min2019_4_CompatibleMinorVersion}"; + case "2020": return $"2020.3.{min2020_3_CompatibleMinorVersion}"; + case "2021": return $"2021.3.{min2021_3_CompatibleMinorVersion}"; default: throw new Exception($"not support version:{branch}"); } } @@ -123,7 +111,7 @@ namespace HybridCLR.Editor.Installer } switch(branch) { - case "2019.4.40": + case "2019": { if (unityVersion.Major != 2019 || unityVersion.Minor1 != 4) { @@ -131,7 +119,7 @@ namespace HybridCLR.Editor.Installer } return unityVersion.Minor2 >= min2019_4_CompatibleMinorVersion; } - case "2020.3.33": + case "2020": { if (unityVersion.Major != 2020 || unityVersion.Minor1 != 3) { @@ -139,7 +127,7 @@ namespace HybridCLR.Editor.Installer } return unityVersion.Minor2 >= min2020_3_CompatibleMinorVersion; } - case "2021.3.1": + case "2021": { if (unityVersion.Major != 2021 || unityVersion.Minor1 != 3) { @@ -248,7 +236,7 @@ namespace HybridCLR.Editor.Installer public bool IsUnity2019(string branch) { - return branch.Contains("2019."); + return branch.Contains("2019"); } @@ -327,7 +315,7 @@ namespace HybridCLR.Editor.Installer "clone", "--depth=1", "-b", - il2cppBranch, + $"{il2cppBranch}-main", il2cppPlusRepoURL, il2cppPlusRepoDir, } diff --git a/Editor/Installer/InstallerWindow.cs b/Editor/Installer/InstallerWindow.cs index 523057a..345416a 100644 --- a/Editor/Installer/InstallerWindow.cs +++ b/Editor/Installer/InstallerWindow.cs @@ -38,19 +38,6 @@ namespace HybridCLR.Editor.Installer string minCompatibleVersion = m_Controller.GetMinCompatibleVersion(il2cppBranch); GUI.enabled = true; GUILayout.Space(10f); - EditorGUILayout.LabelField("=======================说明===================="); - EditorGUILayout.LabelField( - $"你所在项目的Unity版本可以与il2cpp_plus版本:{il2cppBranch} 不一样。\n" - + $"如果你的Unity的版本号 >= {minCompatibleVersion}, 可以直接安装。\n" - + $"如果你的Unity的版本号 < {minCompatibleVersion}, \n" - + $"由于安装HybridCLR时需要从il2cpp_plus兼容版本{il2cppBranch}(而不是你项目版本)拷贝il2cpp目录,\n" - + $"你必须同时安装兼容版本 {il2cppBranch} 才能完成安装", EditorStyles.wordWrappedLabel); - EditorGUILayout.LabelField("=============================================="); - - GUILayout.Space(10f); - - EditorGUILayout.LabelField($"当前Unity版本: {Application.unityVersion},匹配的il2cpp_plus分支: {il2cppBranch}"); - GUILayout.Space(5f); EditorGUILayout.BeginVertical("box"); bool hasInstall = m_Controller.HasInstalledHybridCLR(); @@ -73,12 +60,12 @@ namespace HybridCLR.Editor.Installer EditorGUILayout.BeginHorizontal(); - EditorGUILayout.LabelField("待安装的 hybridclr 仓库版本号(或tag)(默认取最新版本):", GUILayout.MaxWidth(400)); + EditorGUILayout.LabelField("待安装的 hybridclr 仓库版本号(或branch或tag)(默认取最新版本):", GUILayout.MaxWidth(400)); _hybridclrVersion = EditorGUILayout.TextField(_hybridclrVersion); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); - EditorGUILayout.LabelField($"待安装的 il2cpp_plus 仓库版本号(或tag)(默认取{il2cppBranch}分支最新版本):", GUILayout.MaxWidth(400)); + EditorGUILayout.LabelField($"待安装的 il2cpp_plus 仓库版本号(或branch或tag)(默认取{il2cppBranch}-main分支最新版本):", GUILayout.MaxWidth(400)); _il2cppPlusVersion = EditorGUILayout.TextField(_il2cppPlusVersion); EditorGUILayout.EndHorizontal(); diff --git a/package.json b/package.json index ecd546a..0f00897 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.0.1", + "version": "1.1.0", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From 93f855f8ae0157e94105b9831ed4992779cfc773 Mon Sep 17 00:00:00 2001 From: walon Date: Tue, 29 Nov 2022 17:11:25 +0800 Subject: [PATCH 02/19] =?UTF-8?q?[fix]=20=E4=BF=AE=E5=A4=8D=E7=94=9F?= =?UTF-8?q?=E6=88=90=E6=A1=A5=E6=8E=A5=E5=87=BD=E6=95=B0=E6=97=B6=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E4=BD=BF=E7=94=A8editor=E7=8E=AF=E5=A2=83=E7=9A=84dll?= =?UTF-8?q?=EF=BC=8C=E5=AF=BC=E8=87=B4NativeArray=E4=B9=8B=E7=B1=BB?= =?UTF-8?q?=E7=9A=84=E7=B1=BB=E5=9E=8B=E4=B8=8E=E6=89=93=E5=8C=85=E7=9A=84?= =?UTF-8?q?aot=20dll=E4=B8=8D=E4=B8=80=E8=87=B4=EF=BC=8C=E8=BF=9B=E8=80=8C?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=A1=A5=E6=8E=A5=E7=AD=BE=E5=90=8D=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84bug=E3=80=82=E7=9B=AE=E5=89=8D=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E4=BB=8E=E8=A3=81=E5=89=AA=E5=90=8E=E7=9A=84AOT=20dll?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E8=AF=BB=E5=8F=96=EF=BC=8C=E4=BD=86=E7=BC=BA?= =?UTF-8?q?=E7=82=B9=E6=98=AF=E9=9C=80=E8=A6=81=E5=85=88build=E4=B8=80?= =?UTF-8?q?=E6=AC=A1=E7=94=9F=E6=88=90AOT=20dll=EF=BC=8C=E5=86=8D=E7=94=9F?= =?UTF-8?q?=E6=88=90=E6=A1=A5=E6=8E=A5=E5=87=BD=E6=95=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Commands/MethodBridgeGeneratorCommand.cs | 14 ++++++++++---- Editor/Meta/MetaUtil.cs | 2 +- ...olver.cs => UnityDotNetAOTAssemblyResolver.cs} | 15 ++++++++++++++- ...eta => UnityDotNetAOTAssemblyResolver.cs.meta} | 2 +- package.json | 2 +- 5 files changed, 27 insertions(+), 8 deletions(-) rename Editor/Meta/{UnityAOTAssemblyResolver.cs => UnityDotNetAOTAssemblyResolver.cs} (50%) rename Editor/Meta/{UnityAOTAssemblyResolver.cs.meta => UnityDotNetAOTAssemblyResolver.cs.meta} (83%) diff --git a/Editor/Commands/MethodBridgeGeneratorCommand.cs b/Editor/Commands/MethodBridgeGeneratorCommand.cs index 4c092b2..3d33549 100644 --- a/Editor/Commands/MethodBridgeGeneratorCommand.cs +++ b/Editor/Commands/MethodBridgeGeneratorCommand.cs @@ -51,16 +51,22 @@ namespace HybridCLR.Editor.Commands GenerateMethodBridge(true); } + static IAssemblyResolver CreateBuildTargetAssemblyResolver(BuildTarget target) + { + return new CombinedAssemblyResolver(new PathAssemblyResolver( + SettingsUtil.GetAssembliesPostIl2CppStripDir(target), + SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target)) + ); + } + public static void GenerateMethodBridge(bool compileDll) { - // 此处理论会有点问题,打每个平台的时候,都得针对当前平台生成桥接函数 - // 但影响不大,先这样吧 + BuildTarget target = EditorUserBuildSettings.activeBuildTarget; if (compileDll) { CompileDllCommand.CompileDllActiveBuildTarget(); } - - using (AssemblyReferenceDeepCollector collector = new AssemblyReferenceDeepCollector(MetaUtil.CreateBuildTargetAssemblyResolver(EditorUserBuildSettings.activeBuildTarget), SettingsUtil.HotUpdateAssemblyNames)) + using (AssemblyReferenceDeepCollector collector = new AssemblyReferenceDeepCollector(CreateBuildTargetAssemblyResolver(target), SettingsUtil.HotUpdateAssemblyNames)) { var analyzer = new Analyzer(new Analyzer.Options { diff --git a/Editor/Meta/MetaUtil.cs b/Editor/Meta/MetaUtil.cs index 45983ab..167cc15 100644 --- a/Editor/Meta/MetaUtil.cs +++ b/Editor/Meta/MetaUtil.cs @@ -124,7 +124,7 @@ namespace HybridCLR.Editor.Meta return new CombinedAssemblyResolver(new PathAssemblyResolver( SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target)), new UnityPluginAssemblyResolver(), - new UnityAOTAssemblyResolver(), + new UnityDotNetAOTAssemblyResolver(), new UnityEditorAssemblyResolver()); } } diff --git a/Editor/Meta/UnityAOTAssemblyResolver.cs b/Editor/Meta/UnityDotNetAOTAssemblyResolver.cs similarity index 50% rename from Editor/Meta/UnityAOTAssemblyResolver.cs rename to Editor/Meta/UnityDotNetAOTAssemblyResolver.cs index fcd0319..b8df2a6 100644 --- a/Editor/Meta/UnityAOTAssemblyResolver.cs +++ b/Editor/Meta/UnityDotNetAOTAssemblyResolver.cs @@ -9,12 +9,25 @@ using UnityEngine; namespace HybridCLR.Editor.Meta { - public class UnityAOTAssemblyResolver : IAssemblyResolver + public class UnityDotNetAOTAssemblyResolver : IAssemblyResolver { public string ResolveAssembly(string assemblyName, bool throwExIfNotFind) { // +#if !UNITY_2021_1_OR_NEWER var assemblyFile = $"{UnityEditor.EditorApplication.applicationContentsPath}/MonoBleedingEdge/lib/mono/unityaot/{assemblyName}.dll"; +#else +#if UNITY_STANDALONE_WIN + var assemblyFile = $"{UnityEditor.EditorApplication.applicationContentsPath}/MonoBleedingEdge/lib/mono/unityaot-win32/{assemblyName}.dll"; +#elif UNITY_STANDALONE_OSX || UNITY_IOS + var assemblyFile = $"{UnityEditor.EditorApplication.applicationContentsPath}/MonoBleedingEdge/lib/mono/unityaot-macos/{assemblyName}.dll"; +#elif UNITY_STANDALONE_LINUX || UNITY_ANDROID + var assemblyFile = $"{UnityEditor.EditorApplication.applicationContentsPath}/MonoBleedingEdge/lib/mono/unityaot-linux/{assemblyName}.dll"; +#else + var assemblyFile = $"{UnityEditor.EditorApplication.applicationContentsPath}/MonoBleedingEdge/lib/mono/unityaot-linux/{assemblyName}.dll"; +#endif +#endif + if (File.Exists(assemblyFile)) { Debug.Log($"UnityAOTAssemblyResolver.ResolveAssembly:{assemblyFile}"); diff --git a/Editor/Meta/UnityAOTAssemblyResolver.cs.meta b/Editor/Meta/UnityDotNetAOTAssemblyResolver.cs.meta similarity index 83% rename from Editor/Meta/UnityAOTAssemblyResolver.cs.meta rename to Editor/Meta/UnityDotNetAOTAssemblyResolver.cs.meta index 8fb10f3..ce41f39 100644 --- a/Editor/Meta/UnityAOTAssemblyResolver.cs.meta +++ b/Editor/Meta/UnityDotNetAOTAssemblyResolver.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 029bc0368e1ada342aa29a18d4fae879 +guid: 87ece9687eaa17648bdc9d2c9bf30520 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/package.json b/package.json index 0f00897..1ee9382 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.0", + "version": "1.1.1", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From b066cc50faef375fb4dca11e93d7017d86ad81ac Mon Sep 17 00:00:00 2001 From: walon Date: Wed, 30 Nov 2022 09:21:25 +0800 Subject: [PATCH 03/19] =?UTF-8?q?[fix]=20=E4=BF=AE=E5=A4=8D=3F=3F=3D?= =?UTF-8?q?=E8=AF=AD=E6=B3=95=E5=9C=A82019=E4=B8=8B=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E5=87=BA=E9=94=99=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Installer/UpdateController.cs | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Editor/Installer/UpdateController.cs b/Editor/Installer/UpdateController.cs index 962f69c..ce7ec81 100644 --- a/Editor/Installer/UpdateController.cs +++ b/Editor/Installer/UpdateController.cs @@ -6,7 +6,7 @@ namespace HybridCLR.Editor.Installer { private string _hybridclrLocalVersion; - public string HybridclrLocalVersion => _hybridclrLocalVersion ??= GetHybridCLRLocalVersion(); + public string HybridclrLocalVersion => _hybridclrLocalVersion != null ? _hybridclrLocalVersion : _hybridclrLocalVersion = GetHybridCLRLocalVersion(); private string GetHybridCLRLocalVersion() { @@ -31,7 +31,7 @@ namespace HybridCLR.Editor.Installer private string _il2cppPlusLocalVersion; - public string Il2cppPlusLocalVersion => _il2cppPlusLocalVersion ??= GetIl2cppPlusLocalVersion(); + public string Il2cppPlusLocalVersion => _il2cppPlusLocalVersion != null ? _il2cppPlusLocalVersion : _il2cppPlusLocalVersion = GetIl2cppPlusLocalVersion(); private string GetIl2cppPlusLocalVersion() { diff --git a/package.json b/package.json index 1ee9382..27eeec5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.1", + "version": "1.1.2", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From 45d97d758fb03db1fe2228d3cb5b0293ef584454 Mon Sep 17 00:00:00 2001 From: walon Date: Wed, 30 Nov 2022 17:31:11 +0800 Subject: [PATCH 04/19] =?UTF-8?q?[change]=20=E6=A1=A5=E6=8E=A5=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E7=94=9F=E6=88=90=E6=97=B6=EF=BC=8C=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=B7=9F=E6=97=A7=E7=89=88=E6=9C=AC=E4=B8=80=E6=A0=B7=E7=9A=84?= =?UTF-8?q?=E6=89=98=E5=BA=95AssemblyResolver=EF=BC=8C=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E9=A1=B9=E7=9B=AE=E7=AC=AC=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=20generate/all=20=E5=A4=B1=E8=B4=A5=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Commands/MethodBridgeGeneratorCommand.cs | 5 ++++- package.json | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Editor/Commands/MethodBridgeGeneratorCommand.cs b/Editor/Commands/MethodBridgeGeneratorCommand.cs index 3d33549..053bf31 100644 --- a/Editor/Commands/MethodBridgeGeneratorCommand.cs +++ b/Editor/Commands/MethodBridgeGeneratorCommand.cs @@ -55,7 +55,10 @@ namespace HybridCLR.Editor.Commands { return new CombinedAssemblyResolver(new PathAssemblyResolver( SettingsUtil.GetAssembliesPostIl2CppStripDir(target), - SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target)) + SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target)), + new UnityPluginAssemblyResolver(), + new UnityDotNetAOTAssemblyResolver(), + new UnityEditorAssemblyResolver() ); } diff --git a/package.json b/package.json index 27eeec5..66a9741 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.2", + "version": "1.1.3", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From abc70a7ffc52c795dc3f8fe32c7151d05c2c49c2 Mon Sep 17 00:00:00 2001 From: walon Date: Fri, 2 Dec 2022 10:33:13 +0800 Subject: [PATCH 05/19] =?UTF-8?q?[new]=20=E6=94=AF=E6=8C=81=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E5=A4=96=E9=83=A8=E7=83=AD=E6=9B=B4=E6=96=B0?= =?UTF-8?q?dll=E7=9A=84=E6=90=9C=E7=B4=A2=E8=B7=AF=E5=BE=84=20externalHotU?= =?UTF-8?q?pdateAssembliyDirs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Meta/MetaUtil.cs | 27 ++++++++++++++++++--- Editor/Settings/HybridCLRSettingProvider.cs | 3 +++ Editor/Settings/HybridCLRSettings.cs | 8 +++--- package.json | 2 +- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/Editor/Meta/MetaUtil.cs b/Editor/Meta/MetaUtil.cs index 167cc15..233ff88 100644 --- a/Editor/Meta/MetaUtil.cs +++ b/Editor/Meta/MetaUtil.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using UnityEditor; namespace HybridCLR.Editor.Meta { @@ -119,10 +120,30 @@ namespace HybridCLR.Editor.Meta return typeSigs.Select(s => ToShareTypeSig(s)).ToList(); } - public static IAssemblyResolver CreateBuildTargetAssemblyResolver(UnityEditor.BuildTarget target) + public static IAssemblyResolver CreateHotUpdateAssemblyResolver(BuildTarget target) { - return new CombinedAssemblyResolver(new PathAssemblyResolver( - SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target)), + var externalDirs = HybridCLRSettings.Instance.externalHotUpdateAssembliyDirs; + var defaultHotUpdateOutputDir = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target); + if (externalDirs == null || externalDirs.Length == 0) + { + return new PathAssemblyResolver(defaultHotUpdateOutputDir); + } + else + { + var externalDirList = new List(); + foreach (var dir in externalDirs) + { + externalDirList.Add($"{dir}/{target}"); + externalDirList.Add(dir); + } + externalDirList.Add(defaultHotUpdateOutputDir); + return new PathAssemblyResolver(externalDirList.ToArray()); + } + } + + public static IAssemblyResolver CreateBuildTargetAssemblyResolver(BuildTarget target) + { + return new CombinedAssemblyResolver(CreateHotUpdateAssemblyResolver(target), new UnityPluginAssemblyResolver(), new UnityDotNetAOTAssemblyResolver(), new UnityEditorAssemblyResolver()); diff --git a/Editor/Settings/HybridCLRSettingProvider.cs b/Editor/Settings/HybridCLRSettingProvider.cs index 237764d..2543937 100644 --- a/Editor/Settings/HybridCLRSettingProvider.cs +++ b/Editor/Settings/HybridCLRSettingProvider.cs @@ -17,6 +17,7 @@ namespace HybridCLR.Editor private SerializedProperty _hotUpdateAssemblies; private SerializedProperty _preserveHotUpdateAssemblies; private SerializedProperty _hotUpdateDllCompileOutputRootDir; + private SerializedProperty _externalHotUpdateAssembliyDirs; private SerializedProperty _strippedAOTDllOutputRootDir; private SerializedProperty _patchAOTAssemblies; private SerializedProperty _differentialHybridAssemblies; @@ -46,6 +47,7 @@ namespace HybridCLR.Editor _hotUpdateAssemblies = _serializedObject.FindProperty("hotUpdateAssemblies"); _preserveHotUpdateAssemblies = _serializedObject.FindProperty("preserveHotUpdateAssemblies"); _hotUpdateDllCompileOutputRootDir = _serializedObject.FindProperty("hotUpdateDllCompileOutputRootDir"); + _externalHotUpdateAssembliyDirs = _serializedObject.FindProperty("externalHotUpdateAssembliyDirs"); _strippedAOTDllOutputRootDir = _serializedObject.FindProperty("strippedAOTDllOutputRootDir"); _patchAOTAssemblies = _serializedObject.FindProperty("patchAOTAssemblies"); _differentialHybridAssemblies = _serializedObject.FindProperty("differentialHybridAssemblies"); @@ -136,6 +138,7 @@ namespace HybridCLR.Editor EditorGUILayout.PropertyField(_hotUpdateAssemblies); EditorGUILayout.PropertyField(_preserveHotUpdateAssemblies); EditorGUILayout.PropertyField(_hotUpdateDllCompileOutputRootDir); + EditorGUILayout.PropertyField(_externalHotUpdateAssembliyDirs); EditorGUILayout.PropertyField(_strippedAOTDllOutputRootDir); EditorGUILayout.PropertyField(_patchAOTAssemblies); EditorGUILayout.PropertyField(_differentialHybridAssemblies); diff --git a/Editor/Settings/HybridCLRSettings.cs b/Editor/Settings/HybridCLRSettings.cs index 2a7f0a0..d926b69 100644 --- a/Editor/Settings/HybridCLRSettings.cs +++ b/Editor/Settings/HybridCLRSettings.cs @@ -29,6 +29,9 @@ namespace HybridCLR.Editor [Header("热更新dll编译输出根目录")] public string hotUpdateDllCompileOutputRootDir = "HybridCLRData/HotUpdateDlls"; + [Header("外部热更新dll搜索路径")] + public string[] externalHotUpdateAssembliyDirs; + [Header("裁减后AOT dll输出根目录")] public string strippedAOTDllOutputRootDir = "HybridCLRData/AssembliesPostIl2CppStrip"; @@ -39,7 +42,7 @@ namespace HybridCLR.Editor public string[] differentialHybridAssemblies; [Header("差分混合热更新配置数据输出目录")] - public string differentialHybridOptionOutputDir = "Assets/StreamingAssets"; + public string differentialHybridOptionOutputDir = "HybridCLRData/DifferentialHybridOptionDatas"; [Header("生成link.xml时扫描asset中引用的类型")] public bool collectAssetReferenceTypes; @@ -53,9 +56,6 @@ namespace HybridCLR.Editor [Header("AOT泛型实例化搜索迭代次数")] public int maxGenericReferenceIteration = 10; - //[Header("预留MonoPInvokeCallbackAttribute函数个数")] - //public int ReversePInvokeWrapperCount = 10; - [Header("MethodBridge泛型搜索迭代次数")] public int maxMethodBridgeGenericIteration = 10; } diff --git a/package.json b/package.json index 66a9741..18c1324 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.3", + "version": "1.1.4", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From bc6e285b92d8e9d9b19fa89e2b0d90376e88d28f Mon Sep 17 00:00:00 2001 From: walon Date: Fri, 2 Dec 2022 13:14:06 +0800 Subject: [PATCH 06/19] =?UTF-8?q?[change]=20=E7=A6=81=E7=94=A8HybridCLR?= =?UTF-8?q?=E6=97=B6=E4=B8=8D=E5=86=8D=E5=A4=8D=E5=88=B6=E8=A3=81=E5=89=AA?= =?UTF-8?q?=E5=90=8E=E7=9A=84AOT=20dll=20[new]=20SettingsUtil.Enable=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81setter=EF=BC=8C=E5=85=81=E8=AE=B8=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=B8=AD=E4=BF=AE=E6=94=B9=E5=BC=80=E5=90=AF=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/BuildProcessors/CopyStrippedAOTAssemblies.cs | 5 +++++ Editor/SettingsUtil.cs | 10 +++++++++- package.json | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Editor/BuildProcessors/CopyStrippedAOTAssemblies.cs b/Editor/BuildProcessors/CopyStrippedAOTAssemblies.cs index fcce70c..3cbd5da 100644 --- a/Editor/BuildProcessors/CopyStrippedAOTAssemblies.cs +++ b/Editor/BuildProcessors/CopyStrippedAOTAssemblies.cs @@ -57,6 +57,11 @@ namespace HybridCLR.Editor.BuildProcessors public static void CopyStripDlls(string srcStripDllPath, BuildTarget target) { + if (!SettingsUtil.Enable) + { + Debug.Log($"[CopyStrippedAOTAssemblies] disabled"); + return; + } Debug.Log($"[CopyStrippedAOTAssemblies] CopyScripDlls. src:{srcStripDllPath} target:{target}"); var dstPath = SettingsUtil.GetAssembliesPostIl2CppStripDir(target); diff --git a/Editor/SettingsUtil.cs b/Editor/SettingsUtil.cs index 8265175..84d544e 100644 --- a/Editor/SettingsUtil.cs +++ b/Editor/SettingsUtil.cs @@ -11,7 +11,15 @@ namespace HybridCLR.Editor { public static class SettingsUtil { - public static bool Enable => HybridCLRSettings.Instance.enable; + public static bool Enable + { + get => HybridCLRSettings.Instance.enable; + set + { + HybridCLRSettings.Instance.enable = value; + HybridCLRSettings.Save(); + } + } public static string PackageName { get; } = "com.focus-creative-games.hybridclr_unity"; diff --git a/package.json b/package.json index 18c1324..8ae6690 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.4", + "version": "1.1.5", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From e7fac5b0b84acc37743554db21c6f152a5e300f9 Mon Sep 17 00:00:00 2001 From: walon Date: Sat, 3 Dec 2022 11:56:36 +0800 Subject: [PATCH 07/19] =?UTF-8?q?[change]=20=E7=A7=BB=E9=99=A4DHE=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DifferentialHybridExecutionCommand.cs | 56 --------------- ...DifferentialHybridExecutionCommand.cs.meta | 11 --- Editor/Commands/PrebuildCommand.cs | 2 - Editor/DHE.meta | 8 --- Editor/DHE/AssemblyListGenerator.cs | 44 ------------ Editor/DHE/AssemblyListGenerator.cs.meta | 11 --- Editor/DHE/AssemblyOptionDataGenerator.cs | 68 ------------------- .../DHE/AssemblyOptionDataGenerator.cs.meta | 11 --- Editor/Settings/HybridCLRSettingProvider.cs | 6 -- Editor/Settings/HybridCLRSettings.cs | 6 -- 10 files changed, 223 deletions(-) delete mode 100644 Editor/Commands/DifferentialHybridExecutionCommand.cs delete mode 100644 Editor/Commands/DifferentialHybridExecutionCommand.cs.meta delete mode 100644 Editor/DHE.meta delete mode 100644 Editor/DHE/AssemblyListGenerator.cs delete mode 100644 Editor/DHE/AssemblyListGenerator.cs.meta delete mode 100644 Editor/DHE/AssemblyOptionDataGenerator.cs delete mode 100644 Editor/DHE/AssemblyOptionDataGenerator.cs.meta diff --git a/Editor/Commands/DifferentialHybridExecutionCommand.cs b/Editor/Commands/DifferentialHybridExecutionCommand.cs deleted file mode 100644 index 6478c7a..0000000 --- a/Editor/Commands/DifferentialHybridExecutionCommand.cs +++ /dev/null @@ -1,56 +0,0 @@ -using HybridCLR.Editor.DHE; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using UnityEditor; -using UnityEngine; - -namespace HybridCLR.Editor.Commands -{ - public static class DifferentialHybridExecutionCommand - { - [MenuItem("HybridCLR/Generate/DHEAssemblyList", priority = 110)] - public static void GenerateAssemblyList() - { - var options = new AssemblyListGenerator.Options() - { - DifferentialHybridAssembyList = (HybridCLRSettings.Instance.differentialHybridAssemblies ?? Array.Empty()).ToList(), - OutputFile = $"{SettingsUtil.LocalIl2CppDir}/libil2cpp/hybridclr/Il2CppCompatibleDef.cpp", - }; - - var g = new AssemblyListGenerator(options); - g.Generate(); - } - - - [MenuItem("HybridCLR/Generate/DHEAssemblyOptionDatas", priority = 111)] - public static void GenerateAssemblyOptionDatas() - { - GenerateAssemblyOptionDatas(true); - } - - public static void GenerateAssemblyOptionDatas(bool compileDll) - { - if (compileDll) - { - CompileDllCommand.CompileDllActiveBuildTarget(); - } - string[] differentialHybridAssemblyList = HybridCLRSettings.Instance.differentialHybridAssemblies; - if (differentialHybridAssemblyList == null || differentialHybridAssemblyList.Length == 0) - { - Debug.Log("[DifferentialHybridExecutionCommand.GenerateAssemblyOptionDatas] differentialHybridAssemblies is empty. skip generation."); - return; - } - var options = new AssemblyOptionDataGenerator.Options() - { - DifferentialHybridAssembyList = differentialHybridAssemblyList.ToList(), - OutputDir = $"{SettingsUtil.ProjectDir}/{HybridCLRSettings.Instance.differentialHybridOptionOutputDir}", - }; - - var g = new AssemblyOptionDataGenerator(options); - g.Generate(); - } - } -} diff --git a/Editor/Commands/DifferentialHybridExecutionCommand.cs.meta b/Editor/Commands/DifferentialHybridExecutionCommand.cs.meta deleted file mode 100644 index c74092b..0000000 --- a/Editor/Commands/DifferentialHybridExecutionCommand.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 998b5f512dc60924e953a558ed250e15 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Editor/Commands/PrebuildCommand.cs b/Editor/Commands/PrebuildCommand.cs index d2c97b0..d2a64d5 100644 --- a/Editor/Commands/PrebuildCommand.cs +++ b/Editor/Commands/PrebuildCommand.cs @@ -16,8 +16,6 @@ namespace HybridCLR.Editor.Commands public static void GenerateAll() { Il2CppDefGeneratorCommand.GenerateIl2CppDef(); - DifferentialHybridExecutionCommand.GenerateAssemblyList(); - DifferentialHybridExecutionCommand.GenerateAssemblyOptionDatas(); // 顺序随意 ReversePInvokeWrapperGeneratorCommand.GenerateReversePInvokeWrapper(); diff --git a/Editor/DHE.meta b/Editor/DHE.meta deleted file mode 100644 index d2c3a4c..0000000 --- a/Editor/DHE.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 1e6e11530acf7134796d0a439a6bbe61 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Editor/DHE/AssemblyListGenerator.cs b/Editor/DHE/AssemblyListGenerator.cs deleted file mode 100644 index 9b4f9b5..0000000 --- a/Editor/DHE/AssemblyListGenerator.cs +++ /dev/null @@ -1,44 +0,0 @@ -using HybridCLR.Editor.Template; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using UnityEngine; - -namespace HybridCLR.Editor.DHE -{ - public class AssemblyListGenerator - { - public class Options - { - public string OutputFile { get; set; } - - public List DifferentialHybridAssembyList { get; set; } - } - - private readonly Options _options; - public AssemblyListGenerator(Options options) - { - _options = options; - } - - public void Generate() - { - var frr = new FileRegionReplace(File.ReadAllText(_options.OutputFile)); - - List lines = new List(); - foreach (var ass in _options.DifferentialHybridAssembyList) - { - lines.Add($"\t\t\"{ass}\","); - } - - frr.Replace("DHE", string.Join("\n", lines)); - - frr.Commit(_options.OutputFile); - Debug.Log($"output:{_options.OutputFile}"); - } - } -} diff --git a/Editor/DHE/AssemblyListGenerator.cs.meta b/Editor/DHE/AssemblyListGenerator.cs.meta deleted file mode 100644 index f6d21a8..0000000 --- a/Editor/DHE/AssemblyListGenerator.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d6be260bc9a8a40468a82b9ea49b89a1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Editor/DHE/AssemblyOptionDataGenerator.cs b/Editor/DHE/AssemblyOptionDataGenerator.cs deleted file mode 100644 index f9d7bfe..0000000 --- a/Editor/DHE/AssemblyOptionDataGenerator.cs +++ /dev/null @@ -1,68 +0,0 @@ -using dnlib.DotNet; -using HybridCLR.Editor.Commands; -using HybridCLR.Editor.Meta; -using HybridCLR.Runtime; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using UnityEditor; -using UnityEngine; - -namespace HybridCLR.Editor.DHE -{ - public class AssemblyOptionDataGenerator - { - public class Options - { - public string OutputDir { get; set; } - - public List DifferentialHybridAssembyList { get; set; } - } - - private readonly Options _options; - - public AssemblyOptionDataGenerator(Options options) - { - _options = options; - } - - public void Generate() - { - foreach(string assName in _options.DifferentialHybridAssembyList) - { - using (var assCollector = new AssemblyCache(MetaUtil.CreateBuildTargetAssemblyResolver(EditorUserBuildSettings.activeBuildTarget))) - { - var ass = assCollector.LoadModule(assName); - - var dhaOptions = new DifferentialHybridAssemblyOptions() - { - notChangeMethodTokens = new List(), - }; - - foreach (var type in ass.GetTypes()) - { - foreach (var method in type.Methods) - { - var attr = method.CustomAttributes.Where(a => a.AttributeType.FullName == "HybridCLR.Runtime.UnchangedAttribute").FirstOrDefault(); - if (attr != null) - { - if ((bool)attr.ConstructorArguments[0].Value) - { - dhaOptions.notChangeMethodTokens.Add(method.MDToken.Raw); - Debug.Log($"Unchanged method:{method.MDToken.Raw} {method}"); - } - } - } - } - string outOptionFile = $"{_options.OutputDir}/{assName}.dhao.bytes"; - File.WriteAllBytes(outOptionFile, dhaOptions.Marshal()); - Debug.Log($"[AssemblyOptionDataGenerator] assembly:{ass} output:{outOptionFile}"); - } - } - } - } -} diff --git a/Editor/DHE/AssemblyOptionDataGenerator.cs.meta b/Editor/DHE/AssemblyOptionDataGenerator.cs.meta deleted file mode 100644 index 3ccdeaa..0000000 --- a/Editor/DHE/AssemblyOptionDataGenerator.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4a4eda50e51d72d499b439da236a8371 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Editor/Settings/HybridCLRSettingProvider.cs b/Editor/Settings/HybridCLRSettingProvider.cs index 2543937..a44b973 100644 --- a/Editor/Settings/HybridCLRSettingProvider.cs +++ b/Editor/Settings/HybridCLRSettingProvider.cs @@ -20,8 +20,6 @@ namespace HybridCLR.Editor private SerializedProperty _externalHotUpdateAssembliyDirs; private SerializedProperty _strippedAOTDllOutputRootDir; private SerializedProperty _patchAOTAssemblies; - private SerializedProperty _differentialHybridAssemblies; - private SerializedProperty _differentialHybridOptionOutputDir; private SerializedProperty _collectAssetReferenceTypes; private SerializedProperty _outputLinkFile; private SerializedProperty _outputAOTGenericReferenceFile; @@ -50,8 +48,6 @@ namespace HybridCLR.Editor _externalHotUpdateAssembliyDirs = _serializedObject.FindProperty("externalHotUpdateAssembliyDirs"); _strippedAOTDllOutputRootDir = _serializedObject.FindProperty("strippedAOTDllOutputRootDir"); _patchAOTAssemblies = _serializedObject.FindProperty("patchAOTAssemblies"); - _differentialHybridAssemblies = _serializedObject.FindProperty("differentialHybridAssemblies"); - _differentialHybridOptionOutputDir = _serializedObject.FindProperty("differentialHybridOptionOutputDir"); _collectAssetReferenceTypes = _serializedObject.FindProperty("collectAssetReferenceTypes"); _outputLinkFile = _serializedObject.FindProperty("outputLinkFile"); _outputAOTGenericReferenceFile = _serializedObject.FindProperty("outputAOTGenericReferenceFile"); @@ -141,8 +137,6 @@ namespace HybridCLR.Editor EditorGUILayout.PropertyField(_externalHotUpdateAssembliyDirs); EditorGUILayout.PropertyField(_strippedAOTDllOutputRootDir); EditorGUILayout.PropertyField(_patchAOTAssemblies); - EditorGUILayout.PropertyField(_differentialHybridAssemblies); - EditorGUILayout.PropertyField(_differentialHybridOptionOutputDir); EditorGUILayout.PropertyField(_collectAssetReferenceTypes); EditorGUILayout.PropertyField(_outputLinkFile); EditorGUILayout.PropertyField(_outputAOTGenericReferenceFile); diff --git a/Editor/Settings/HybridCLRSettings.cs b/Editor/Settings/HybridCLRSettings.cs index d926b69..b97e350 100644 --- a/Editor/Settings/HybridCLRSettings.cs +++ b/Editor/Settings/HybridCLRSettings.cs @@ -38,12 +38,6 @@ namespace HybridCLR.Editor [Header("补充元数据AOT dlls")] public string[] patchAOTAssemblies; - [Header("差分混合热更新 dlls")] - public string[] differentialHybridAssemblies; - - [Header("差分混合热更新配置数据输出目录")] - public string differentialHybridOptionOutputDir = "HybridCLRData/DifferentialHybridOptionDatas"; - [Header("生成link.xml时扫描asset中引用的类型")] public bool collectAssetReferenceTypes; From 38615500fb4ce3ee6ffd05904525a9b66cbc00ff Mon Sep 17 00:00:00 2001 From: walon Date: Sun, 4 Dec 2022 21:37:17 +0800 Subject: [PATCH 08/19] =?UTF-8?q?[change]=20=E7=A7=BB=E9=99=A4HybridCLR.Ru?= =?UTF-8?q?ntime=E4=B8=ADDHE=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/DifferentialHybridAssemblyOptions.cs | 33 ------------ .../DifferentialHybridAssemblyOptions.cs.meta | 11 ---- Runtime/RuntimeApi.cs | 50 ------------------- Runtime/UnchangedAttribute.cs | 18 ------- Runtime/UnchangedAttribute.cs.meta | 11 ---- package.json | 2 +- 6 files changed, 1 insertion(+), 124 deletions(-) delete mode 100644 Runtime/DifferentialHybridAssemblyOptions.cs delete mode 100644 Runtime/DifferentialHybridAssemblyOptions.cs.meta delete mode 100644 Runtime/UnchangedAttribute.cs delete mode 100644 Runtime/UnchangedAttribute.cs.meta diff --git a/Runtime/DifferentialHybridAssemblyOptions.cs b/Runtime/DifferentialHybridAssemblyOptions.cs deleted file mode 100644 index ab76468..0000000 --- a/Runtime/DifferentialHybridAssemblyOptions.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using UnityEngine; - -namespace HybridCLR.Runtime -{ - public class DifferentialHybridAssemblyOptions - { - public const uint Signature = 0xABCDABCD; - - public List notChangeMethodTokens; - - - public byte[] Marshal() - { - var stream = new MemoryStream(); - var writer = new BinaryWriter(stream); - writer.Write(Signature); - writer.Write((uint)notChangeMethodTokens.Count); - foreach (uint token in notChangeMethodTokens) - { - writer.Write(token); - } - writer.Flush(); - stream.Flush(); - byte[] result = new byte[stream.Length]; - stream.Position = 0; - stream.Read(result, 0, result.Length); - Debug.Log($"HotPatchAssemblyConfig. options bytes:{result.Length}"); - return result; - } - } -} diff --git a/Runtime/DifferentialHybridAssemblyOptions.cs.meta b/Runtime/DifferentialHybridAssemblyOptions.cs.meta deleted file mode 100644 index d68dd5f..0000000 --- a/Runtime/DifferentialHybridAssemblyOptions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3394055921ccce643b09466544ea3634 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Runtime/RuntimeApi.cs b/Runtime/RuntimeApi.cs index c87af14..bffc117 100644 --- a/Runtime/RuntimeApi.cs +++ b/Runtime/RuntimeApi.cs @@ -46,56 +46,6 @@ namespace HybridCLR public static extern unsafe int LoadMetadataForAOTAssembly(byte* dllBytes, int dllSize, int mode); - //[DllImport(dllName, EntryPoint = "RuntimeApi_UseDifferentialHybridAOTAssembly")] - //public static unsafe LoadImageErrorCode UseDifferentialHybridAOTAssembly(string assemblyName) - //{ - // byte[] nameBytes = System.Text.Encoding.UTF8.GetBytes(assemblyName); - // fixed(byte* namePtr = nameBytes) - // { - - // } - //} - - /// - /// 指示混合执行assembly使用原始的AOT代码。当assembly没有发生变化时必须调用此接口。 - /// - /// - /// -#if UNITY_EDITOR - public static LoadImageErrorCode UseDifferentialHybridAOTAssembly(string assemblyName) - { - return LoadImageErrorCode.OK; - } -#else - [DllImport(dllName, EntryPoint = "RuntimeApi_UseDifferentialHybridAOTAssembly")] - public static extern LoadImageErrorCode UseDifferentialHybridAOTAssembly(string assemblyName); -#endif - - - /// - /// 加载差分混合执行 assembly - /// - /// - /// - /// - public static unsafe LoadImageErrorCode LoadDifferentialHybridAssembly(byte[] dllBytes, byte[] optionBytes) - { -#if UNITY_EDITOR - return LoadImageErrorCode.OK; -#else - fixed(byte* dllBytesPtr = dllBytes) - { - fixed(byte* optionBytesPtr = optionBytes) - { - return (LoadImageErrorCode)LoadDifferentialHybridAssembly(dllBytesPtr, dllBytes.Length, optionBytesPtr, optionBytes.Length); - } - } -#endif - } - - [DllImport(dllName, EntryPoint = "RuntimeApi_LoadDifferentialHybridAssembly")] - public static extern unsafe int LoadDifferentialHybridAssembly(byte* dllBytes, int dllSize, byte* optionBytesPtr, int optionBytesLength); - /// /// 获取解释器线程栈的最大StackObject个数(size*8 为最终占用的内存大小) /// diff --git a/Runtime/UnchangedAttribute.cs b/Runtime/UnchangedAttribute.cs deleted file mode 100644 index 9337168..0000000 --- a/Runtime/UnchangedAttribute.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace HybridCLR.Runtime -{ - [AttributeUsage(AttributeTargets.Method | AttributeTargets.Struct)] - public class UnchangedAttribute : Attribute - { - public bool Unchanged { get; } - - public UnchangedAttribute(bool unchanged = true) - { - Unchanged = unchanged; - } - } -} diff --git a/Runtime/UnchangedAttribute.cs.meta b/Runtime/UnchangedAttribute.cs.meta deleted file mode 100644 index 59c7de1..0000000 --- a/Runtime/UnchangedAttribute.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 704603a2a0551f247a30e331ca476870 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/package.json b/package.json index 8ae6690..bab2e6e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.5", + "version": "1.1.6", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From 6be8b2671e02c17bc84a23016a53f79f3b2f56f2 Mon Sep 17 00:00:00 2001 From: walon Date: Tue, 6 Dec 2022 11:52:47 +0800 Subject: [PATCH 09/19] =?UTF-8?q?[refactor]=20=E9=87=8D=E6=9E=84Installer?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E5=86=8D=E6=94=AF=E6=8C=81=E4=BB=8E=E5=85=B6?= =?UTF-8?q?=E4=BB=96=E7=89=88=E6=9C=AC=E5=AE=89=E8=A3=85HybridCLR=EF=BC=8C?= =?UTF-8?q?=E6=9E=81=E5=A4=A7=E7=AE=80=E5=8C=96=E4=BA=86=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Installer/InstallerController.cs | 250 +++++++++------------- Editor/Installer/InstallerWindow.cs | 95 ++------ Editor/Installer/UpdateController.cs | 90 -------- Editor/Installer/UpdateController.cs.meta | 3 - package.json | 2 +- 5 files changed, 113 insertions(+), 327 deletions(-) delete mode 100644 Editor/Installer/UpdateController.cs delete mode 100644 Editor/Installer/UpdateController.cs.meta diff --git a/Editor/Installer/InstallerController.cs b/Editor/Installer/InstallerController.cs index 2bcac40..a596f85 100644 --- a/Editor/Installer/InstallerController.cs +++ b/Editor/Installer/InstallerController.cs @@ -18,45 +18,35 @@ namespace HybridCLR.Editor.Installer public enum InstallErrorCode { Ok, - InvalidUnityInstallPath, - Il2CppInstallPathNotMatchIl2CppBranch, - Il2CppInstallPathNotExists, - NotIl2CppPath, } public partial class InstallerController { private const string hybridclr_repo_path = "hybridclr_repo"; + private const string il2cpp_plus_repo_path = "il2cpp_plus_repo"; - private string m_Il2CppInstallDirectory; - public string Il2CppInstallDirectory - { - get - { - return m_Il2CppInstallDirectory; - } - set - { - m_Il2CppInstallDirectory = value?.Replace('\\', '/'); - if (!string.IsNullOrEmpty(m_Il2CppInstallDirectory)) - { - EditorPrefs.SetString("UnityInstallDirectory", m_Il2CppInstallDirectory); - } - } - } - private string GetIl2CppPlusBranchByUnityVersion(string unityVersion) - { - return unityVersion.Split('.')[0]; - } + public int MajorVersion => _curVersion.major; - public string Il2CppBranch => GetIl2CppPlusBranchByUnityVersion(Application.unityVersion); + private UnityVersion _curVersion; public InstallerController() { - PrepareIl2CppInstallPath(); + _curVersion = ParseUnityVersion(Application.unityVersion); + } + + public class UnityVersion + { + public int major; + public int minor1; + public int minor2; + + public override string ToString() + { + return $"{major}.{minor1}.{minor2}"; + } } private static readonly Regex s_unityVersionPat = new Regex(@"(\d+)\.(\d+)\.(\d+)"); @@ -65,145 +55,129 @@ namespace HybridCLR.Editor.Installer public const int min2020_3_CompatibleMinorVersion = 21; public const int min2021_3_CompatibleMinorVersion = 0; - private bool TryParseMinorVersion(string installDir, out (int Major, int Minor1, int Minor2) unityVersion) + private UnityVersion ParseUnityVersion(string versionStr) { - var matches = s_unityVersionPat.Matches(installDir); + var matches = s_unityVersionPat.Matches(versionStr); if (matches.Count == 0) { - unityVersion = default; - return false; + return null; } - // 找最后一个匹配的,有的人居然会把Unity安装目录放到其他安装版本下。无语! + // 找最后一个匹配的 Match match = matches[matches.Count - 1]; // Debug.Log($"capture count:{match.Groups.Count} {match.Groups[1].Value} {match.Groups[2].Value}"); int major = int.Parse(match.Groups[1].Value); int minor1 = int.Parse(match.Groups[2].Value); int minor2 = int.Parse(match.Groups[3].Value); - unityVersion = (major, minor1, minor2); - return true; + return new UnityVersion { major = major, minor1 = minor1, minor2 = minor2 }; } - public string GetCurVersionStr(string installDir) + public string GetCurrentUnityVersionMinCompatibleVersionStr() { - if (TryParseMinorVersion(installDir, out var version)) - { - return $"{version.Major}.{version.Minor1}.{version.Minor2}"; - } - throw new Exception($"not support version:{installDir}"); + return GetMinCompatibleVersion(MajorVersion); } - public string GetMinCompatibleVersion(string branch) + public string GetMinCompatibleVersion(int majorVersion) { - switch(branch) + switch(majorVersion) { - case "2019": return $"2019.4.{min2019_4_CompatibleMinorVersion}"; - case "2020": return $"2020.3.{min2020_3_CompatibleMinorVersion}"; - case "2021": return $"2021.3.{min2021_3_CompatibleMinorVersion}"; - default: throw new Exception($"not support version:{branch}"); + case 2019: return $"2019.4.{min2019_4_CompatibleMinorVersion}"; + case 2020: return $"2020.3.{min2020_3_CompatibleMinorVersion}"; + case 2021: return $"2021.3.{min2021_3_CompatibleMinorVersion}"; + default: throw new Exception($"not support version:{majorVersion}"); } } - private bool IsComaptibleWithIl2CppPlusBranch(string branch, string installDir) + public bool IsComaptibleVersion() { - if (!TryParseMinorVersion(installDir, out var unityVersion)) + UnityVersion version = _curVersion; + switch (version.major) { - return false; - } - switch(branch) - { - case "2019": + case 2019: { - if (unityVersion.Major != 2019 || unityVersion.Minor1 != 4) + if (version.major != 2019 || version.minor1 != 4) { return false; } - return unityVersion.Minor2 >= min2019_4_CompatibleMinorVersion; + return version.minor2 >= min2019_4_CompatibleMinorVersion; } - case "2020": + case 2020: { - if (unityVersion.Major != 2020 || unityVersion.Minor1 != 3) + if (version.major != 2020 || version.minor1 != 3) { return false; } - return unityVersion.Minor2 >= min2020_3_CompatibleMinorVersion; + return version.minor2 >= min2020_3_CompatibleMinorVersion; } - case "2021": + case 2021: { - if (unityVersion.Major != 2021 || unityVersion.Minor1 != 3) + if (version.major != 2021 || version.minor1 != 3) { return false; } - return unityVersion.Minor2 >= min2021_3_CompatibleMinorVersion; + return version.minor2 >= min2021_3_CompatibleMinorVersion; } - default: throw new Exception($"not support il2cpp_plus branch:{branch}"); + default: throw new Exception($"not support il2cpp_plus branch:{version.major}"); } } - void PrepareIl2CppInstallPath() + private string _hybridclrLocalVersion; + + public string HybridclrLocalVersion => _hybridclrLocalVersion != null ? _hybridclrLocalVersion : _hybridclrLocalVersion = GetHybridCLRLocalVersion(); + + private string GetHybridCLRLocalVersion() { -#if UNITY_EDITOR_WIN - - m_Il2CppInstallDirectory = EditorPrefs.GetString("Il2CppInstallDirectory"); - if (CheckValidIl2CppInstallDirectory(Il2CppBranch, m_Il2CppInstallDirectory) == InstallErrorCode.Ok) + string workDir = SettingsUtil.HybridCLRDataDir; + string hybridclrRepoDir = $"{workDir}/{hybridclr_repo_path}"; + if (Directory.Exists(hybridclrRepoDir)) { - return; - } - var il2cppBranch = Il2CppBranch; - var curAppInstallPath = EditorApplication.applicationPath; - if (IsComaptibleWithIl2CppPlusBranch(il2cppBranch, curAppInstallPath)) - { - Il2CppInstallDirectory = $"{Directory.GetParent(curAppInstallPath)}/Data/il2cpp"; - return; - } - string unityHubRootDir = Directory.GetParent(curAppInstallPath).Parent.Parent.ToString(); - // Debug.Log("unity hub root dir:" + unityHubRootDir); - foreach (var unityInstallDir in Directory.GetDirectories(unityHubRootDir, "*", SearchOption.TopDirectoryOnly)) - { - // Debug.Log("Unity install dir:" + unityInstallDir); - if (IsComaptibleWithIl2CppPlusBranch(il2cppBranch, unityInstallDir)) + var ret = BashUtil.RunCommand2(hybridclrRepoDir, "git", + new string[] { "log", "HEAD", "-n", "1", "--pretty=format:\"%H\"", }, + false); + if (ret.ExitCode == 0) { - Il2CppInstallDirectory = $"{unityInstallDir}/Editor/Data/il2cpp"; - return; + return ret.StdOut.Trim(); + } + else + { + return "ERROR"; } } - - Il2CppInstallDirectory = $"{Directory.GetParent(curAppInstallPath)}/Data/il2cpp"; -#else - m_Il2CppInstallDirectory = EditorPrefs.GetString("Il2CppInstallDirectory"); - if (CheckValidIl2CppInstallDirectory(Il2CppBranch, m_Il2CppInstallDirectory) == InstallErrorCode.Ok) - { - return; - } - var il2cppBranch = Il2CppBranch; - var curAppInstallPath = EditorApplication.applicationPath; - if (IsComaptibleWithIl2CppPlusBranch(il2cppBranch, curAppInstallPath)) - { - Il2CppInstallDirectory = $"{curAppInstallPath}/Contents/il2cpp"; - return; - } - string unityHubRootDir = Directory.GetParent(curAppInstallPath).Parent.Parent.ToString(); - foreach (var unityInstallDir in Directory.GetDirectories(unityHubRootDir, "*", SearchOption.TopDirectoryOnly)) - { - Debug.Log("nity install dir:" + unityInstallDir); - if (IsComaptibleWithIl2CppPlusBranch(il2cppBranch, unityInstallDir)) - { - Il2CppInstallDirectory = $"{unityInstallDir}/Unity.app/Contents/il2cpp"; - return; - } - } - - Il2CppInstallDirectory = $"{curAppInstallPath}/Contents/il2cpp"; -#endif + return ""; } - public void InitHybridCLR(string il2cppBranch, string il2cppInstallPath, string hybridclrVer, string il2cppPlusVer) + private string _il2cppPlusLocalVersion; + + public string Il2cppPlusLocalVersion => _il2cppPlusLocalVersion != null ? _il2cppPlusLocalVersion : _il2cppPlusLocalVersion = GetIl2cppPlusLocalVersion(); + + private string GetIl2cppPlusLocalVersion() { - if (CheckValidIl2CppInstallDirectory(il2cppBranch, il2cppInstallPath) != InstallErrorCode.Ok) + string workDir = SettingsUtil.HybridCLRDataDir; + string il2cppPlusRepoDir = $"{workDir}/{il2cpp_plus_repo_path}"; + if (Directory.Exists(il2cppPlusRepoDir)) { - Debug.LogError($"请正确设置 il2cpp 安装目录"); - return; + var ret = BashUtil.RunCommand2(il2cppPlusRepoDir, "git", + new string[] { "log", "HEAD", "-n", "1", "--pretty=format:\"%H\"", }, + false); + if (ret.ExitCode == 0) + { + return ret.StdOut.Trim(); + } + else + { + return "ERROR"; + } } - RunInitLocalIl2CppData(il2cppBranch, il2cppInstallPath, hybridclrVer, il2cppPlusVer); + return ""; + } + + private string GetIl2CppPathByContentPath(string contentPath) + { + return $"{contentPath}/il2cpp"; + } + + public void InstallLocalHybridCLR(string hybridclrVer, string il2cppPlusVer) + { + RunInitLocalIl2CppData(GetIl2CppPathByContentPath(EditorApplication.applicationContentsPath), _curVersion, hybridclrVer, il2cppPlusVer); } public bool HasInstalledHybridCLR() @@ -211,34 +185,6 @@ namespace HybridCLR.Editor.Installer return Directory.Exists($"{SettingsUtil.LocalIl2CppDir}/libil2cpp/hybridclr"); } - public InstallErrorCode CheckValidIl2CppInstallDirectory(string il2cppBranch, string installDir) - { - installDir = installDir.Replace('\\', '/'); - if (!Directory.Exists(installDir)) - { - return InstallErrorCode.Il2CppInstallPathNotExists; - } - - if (!IsComaptibleWithIl2CppPlusBranch(il2cppBranch, installDir)) - { - return TryParseMinorVersion(installDir, out _) ? - InstallErrorCode.Il2CppInstallPathNotMatchIl2CppBranch - : InstallErrorCode.InvalidUnityInstallPath; - } - - if (!installDir.EndsWith("/il2cpp")) - { - return InstallErrorCode.NotIl2CppPath; - } - - return InstallErrorCode.Ok; - } - - public bool IsUnity2019(string branch) - { - return branch.Contains("2019"); - } - private string GetUnityIl2CppDllInstallLocation() { @@ -258,7 +204,7 @@ namespace HybridCLR.Editor.Installer #endif } - private void RunInitLocalIl2CppData(string il2cppBranch, string il2cppInstallPath, string hybridclrVer, string il2cppPlusVer) + private void RunInitLocalIl2CppData(string editorIl2cppPath, UnityVersion version, string hybridclrVer, string il2cppPlusVer) { #if UNITY_EDITOR_WIN if (!BashUtil.ExistProgram("git")) @@ -315,7 +261,7 @@ namespace HybridCLR.Editor.Installer "clone", "--depth=1", "-b", - $"{il2cppBranch}-main", + $"{version.major}-main", il2cppPlusRepoURL, il2cppPlusRepoDir, } @@ -341,10 +287,10 @@ namespace HybridCLR.Editor.Installer BashUtil.RecreateDir(localUnityDataDir); // copy MonoBleedingEdge - BashUtil.CopyDir($"{Directory.GetParent(il2cppInstallPath)}/MonoBleedingEdge", $"{localUnityDataDir}/MonoBleedingEdge", true); + BashUtil.CopyDir($"{Directory.GetParent(editorIl2cppPath)}/MonoBleedingEdge", $"{localUnityDataDir}/MonoBleedingEdge", true); // copy il2cpp - BashUtil.CopyDir(Il2CppInstallDirectory, SettingsUtil.LocalIl2CppDir, true); + BashUtil.CopyDir(editorIl2cppPath, SettingsUtil.LocalIl2CppDir, true); // replace libil2cpp string dstLibil2cppDir = $"{SettingsUtil.LocalIl2CppDir}/libil2cpp"; @@ -354,9 +300,9 @@ namespace HybridCLR.Editor.Installer // clean Il2cppBuildCache BashUtil.RemoveDir($"{SettingsUtil.ProjectDir}/Library/Il2cppBuildCache", true); - if (IsUnity2019(il2cppBranch)) + if (version.major == 2019) { - string curVersionStr = GetCurVersionStr(il2cppInstallPath); + string curVersionStr = version.ToString(); string srcIl2CppDll = GetUnityIl2CppDllModifiedPath(curVersionStr); if (File.Exists(srcIl2CppDll)) { @@ -372,8 +318,8 @@ namespace HybridCLR.Editor.Installer if (HasInstalledHybridCLR()) { Debug.Log("安装成功!"); - _hybridclrLocalVersion = hybridclrVer; - _il2cppPlusLocalVersion = il2cppPlusVer; + _hybridclrLocalVersion = null; + _il2cppPlusLocalVersion = null; } else { diff --git a/Editor/Installer/InstallerWindow.cs b/Editor/Installer/InstallerWindow.cs index 345416a..dbc4c42 100644 --- a/Editor/Installer/InstallerWindow.cs +++ b/Editor/Installer/InstallerWindow.cs @@ -8,14 +8,14 @@ namespace HybridCLR.Editor.Installer { public class InstallerWindow : EditorWindow { - private InstallerController m_Controller; + private InstallerController _controller; string _hybridclrVersion = ""; string _il2cppPlusVersion = ""; private void OnEnable() { - m_Controller = new InstallerController(); + _controller = new InstallerController(); } private void OnGUI() @@ -34,28 +34,22 @@ namespace HybridCLR.Editor.Installer SettingsService.OpenProjectSettings("Project/HybridCLR Settings"); } - string il2cppBranch = m_Controller.Il2CppBranch; - string minCompatibleVersion = m_Controller.GetMinCompatibleVersion(il2cppBranch); - GUI.enabled = true; GUILayout.Space(10f); EditorGUILayout.BeginVertical("box"); - bool hasInstall = m_Controller.HasInstalledHybridCLR(); + bool hasInstall = _controller.HasInstalledHybridCLR(); EditorGUILayout.LabelField($"安装状态:{(hasInstall ? "已安装" : "未安装")}", EditorStyles.boldLabel); - string hybridclrLocalVersion = m_Controller.HybridclrLocalVersion; - string il2cppPlusLocalVersion = m_Controller.Il2cppPlusLocalVersion; if (hasInstall) { - EditorGUILayout.LabelField($"HybridCLR 版本: {hybridclrLocalVersion}"); + EditorGUILayout.LabelField($"HybridCLR 版本: {_controller.HybridclrLocalVersion}"); GUILayout.Space(5f); - EditorGUILayout.LabelField($"il2cpp_plus 版本: {il2cppPlusLocalVersion}"); + EditorGUILayout.LabelField($"il2cpp_plus 版本: {_controller.Il2cppPlusLocalVersion}"); GUILayout.Space(5f); //GUIInstallButton("检查更新", "检查", UpdateHybridCLR); //GUILayout.Space(40f); } - GUISelectUnityDirectory($"il2cpp_plus分支对应的Unity兼容版本的il2cpp路径", "Select"); GUILayout.Space(10f); @@ -65,97 +59,36 @@ namespace HybridCLR.Editor.Installer EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); - EditorGUILayout.LabelField($"待安装的 il2cpp_plus 仓库版本号(或branch或tag)(默认取{il2cppBranch}-main分支最新版本):", GUILayout.MaxWidth(400)); + EditorGUILayout.LabelField($"待安装的 il2cpp_plus 仓库版本号(或branch或tag)(默认取{_controller.MajorVersion}-main分支最新版本):", GUILayout.MaxWidth(400)); _il2cppPlusVersion = EditorGUILayout.TextField(_il2cppPlusVersion); EditorGUILayout.EndHorizontal(); - GUIInstallButton("安装hybridclr+il2cpp_plus代码到本地目录", "安装", InitHybridCLR); + GUIInstallButton("安装hybridclr+il2cpp_plus代码到本地目录", "安装"); EditorGUILayout.EndVertical(); } - private void GUIInstallButton(string content, string button, Action onClick) + private void GUIInstallButton(string content, string button) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(content); - GUI.enabled = m_Controller.CheckValidIl2CppInstallDirectory(m_Controller.Il2CppBranch, m_Controller.Il2CppInstallDirectory) == InstallErrorCode.Ok; if (GUILayout.Button(button, GUILayout.Width(100))) { - onClick?.Invoke(); + InstallLocalHybridCLR(); GUIUtility.ExitGUI(); } - GUI.enabled = true; EditorGUILayout.EndHorizontal(); } - - private void GUISelectUnityDirectory(string content, string selectButton) + private void InstallLocalHybridCLR() { - EditorGUILayout.BeginHorizontal(); - EditorGUILayout.LabelField(content, GUILayout.MaxWidth(300)); - string il2cppInstallDirectory = m_Controller.Il2CppInstallDirectory = EditorGUILayout.TextField(m_Controller.Il2CppInstallDirectory); - if (GUILayout.Button(selectButton, GUILayout.Width(100))) + if (!_controller.IsComaptibleVersion()) { - string temp = EditorUtility.OpenFolderPanel(content, m_Controller.Il2CppInstallDirectory, string.Empty); - if (!string.IsNullOrEmpty(temp)) - { - il2cppInstallDirectory = m_Controller.Il2CppInstallDirectory = temp; - } - } - EditorGUILayout.EndHorizontal(); - - InstallErrorCode err = m_Controller.CheckValidIl2CppInstallDirectory(m_Controller.Il2CppBranch, il2cppInstallDirectory); - switch (err) - { - case InstallErrorCode.Ok: - { - break; - } - case InstallErrorCode.Il2CppInstallPathNotExists: - { - EditorGUILayout.HelpBox("li2cpp 路径不存在", MessageType.Error); - break; - } - case InstallErrorCode.InvalidUnityInstallPath: - { - EditorGUILayout.HelpBox($"Unity安装目录必须包含版本号,否则无法识别版本", MessageType.Error); - break; - } - case InstallErrorCode.Il2CppInstallPathNotMatchIl2CppBranch: - { - EditorGUILayout.HelpBox($"il2cpp 版本不兼容,最小版本为 {m_Controller.GetMinCompatibleVersion(m_Controller.Il2CppBranch)}", MessageType.Error); - break; - } - case InstallErrorCode.NotIl2CppPath: - { - EditorGUILayout.HelpBox($"当前选择的路径不是il2cpp目录(必须类似 xxx/il2cpp)", MessageType.Error); - break; - } - default: throw new Exception($"not support {err}"); - } - } - - private void InitHybridCLR() - { - m_Controller.InitHybridCLR(m_Controller.Il2CppBranch, m_Controller.Il2CppInstallDirectory, _hybridclrVersion, _il2cppPlusVersion); - } - - private void UpdateHybridCLR() - { - bool hasUpdateIl2Cpp = m_Controller.HasUpdateIl2Cpp(m_Controller.Il2CppBranch); - if (hasUpdateIl2Cpp) - { - bool ret = EditorUtility.DisplayDialog("检查更新", "版本不一致", "更新","取消"); - if (ret) - { - InitHybridCLR(); - } - } - else - { - EditorUtility.DisplayDialog("检查更新", "暂无更新", "确定"); + Debug.LogError($"il2cpp 版本不兼容,最小版本为 {_controller.GetCurrentUnityVersionMinCompatibleVersionStr()}"); + return; } + _controller.InstallLocalHybridCLR(_hybridclrVersion, _il2cppPlusVersion); } } } diff --git a/Editor/Installer/UpdateController.cs b/Editor/Installer/UpdateController.cs deleted file mode 100644 index ce7ec81..0000000 --- a/Editor/Installer/UpdateController.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System.IO; - -namespace HybridCLR.Editor.Installer -{ - public partial class InstallerController - { - private string _hybridclrLocalVersion; - - public string HybridclrLocalVersion => _hybridclrLocalVersion != null ? _hybridclrLocalVersion : _hybridclrLocalVersion = GetHybridCLRLocalVersion(); - - private string GetHybridCLRLocalVersion() - { - string workDir = SettingsUtil.HybridCLRDataDir; - string hybridclrRepoDir = $"{workDir}/{hybridclr_repo_path}"; - if (Directory.Exists(hybridclrRepoDir)) - { - var ret = BashUtil.RunCommand2(hybridclrRepoDir, "git", - new string[] { "log", "HEAD", "-n", "1", "--pretty=format:\"%H\"", }, - false); - if (ret.ExitCode == 0) - { - return ret.StdOut.Trim(); - } - else - { - return "ERROR"; - } - } - return ""; - } - - private string _il2cppPlusLocalVersion; - - public string Il2cppPlusLocalVersion => _il2cppPlusLocalVersion != null ? _il2cppPlusLocalVersion : _il2cppPlusLocalVersion = GetIl2cppPlusLocalVersion(); - - private string GetIl2cppPlusLocalVersion() - { - string workDir = SettingsUtil.HybridCLRDataDir; - string il2cppPlusRepoDir = $"{workDir}/{il2cpp_plus_repo_path}"; - if (Directory.Exists(il2cppPlusRepoDir)) - { - var ret = BashUtil.RunCommand2(il2cppPlusRepoDir, "git", - new string[] { "log", "HEAD", "-n", "1", "--pretty=format:\"%H\"", }, - false); - if (ret.ExitCode == 0) - { - return ret.StdOut.Trim(); - } - else - { - return "ERROR"; - } - } - return ""; - } - - public bool HasUpdateIl2Cpp(string il2cppBranch) - { - string workDir = SettingsUtil.HybridCLRDataDir; - // last hash hybridclr - { - string hybridclrRepoDir = $"{workDir}/{hybridclr_repo_path}"; - var ret1 = BashUtil.RunCommand2(hybridclrRepoDir, "git", new string[] { "log", "HEAD", "-n", "1", "--pretty=format:\"%H\"", }, false); - BashUtil.RunCommand2(hybridclrRepoDir, "git", new string[] { "fetch", "--depth=1" }, false); - var ret2 = BashUtil.RunCommand2(hybridclrRepoDir, "git", - new string[] { "log", "remotes/origin/HEAD", "-n", "1", "--pretty=format:\"%H\"", } - , false); - if (ret1.StdOut != ret2.StdOut) - { - return true; - } - } - // last hash il2cpp_plus - { - string il2cppPlusRepoDir = $"{workDir}/{il2cpp_plus_repo_path}"; - var ret1 = BashUtil.RunCommand2(il2cppPlusRepoDir, "git", - new string[] { "log", $"{il2cppBranch}", "-n", "1", "--pretty=format:\"%H\"", }, false); - BashUtil.RunCommand2(il2cppPlusRepoDir, "git", - new string[] { "fetch", "--depth=1" }, false); - var ret2 = BashUtil.RunCommand2(il2cppPlusRepoDir, "git", - new string[] { "log", $"remotes/origin/{il2cppBranch}", "-n", "1", "--pretty=format:\"%H\"", }, false); - if (ret1.StdOut != ret2.StdOut) - { - return true; - } - } - return false; - } - } -} \ No newline at end of file diff --git a/Editor/Installer/UpdateController.cs.meta b/Editor/Installer/UpdateController.cs.meta deleted file mode 100644 index 27ba360..0000000 --- a/Editor/Installer/UpdateController.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 91454a4f0a354d11830642b4d4474d7e -timeCreated: 1665546286 \ No newline at end of file diff --git a/package.json b/package.json index bab2e6e..cb818c3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.6", + "version": "1.1.7", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From 419c3a98f644417505aba867e5e95190a4eb9942 Mon Sep 17 00:00:00 2001 From: walon Date: Tue, 6 Dec 2022 18:57:48 +0800 Subject: [PATCH 10/19] =?UTF-8?q?[opt]=20installer=E5=AE=89=E8=A3=85?= =?UTF-8?q?=E6=88=90=E5=8A=9F=E5=90=8E=E4=BC=9A=E8=AE=B0=E5=BD=95=20?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E7=9A=84=E7=89=88=E6=9C=AC=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E4=B8=94=E6=98=BE=E7=A4=BA=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Installer/InstallerController.cs | 39 ++++++++++++------------- Editor/Installer/InstallerWindow.cs | 22 ++++++++++++-- package.json | 2 +- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/Editor/Installer/InstallerController.cs b/Editor/Installer/InstallerController.cs index a596f85..da81bf1 100644 --- a/Editor/Installer/InstallerController.cs +++ b/Editor/Installer/InstallerController.cs @@ -124,6 +124,20 @@ namespace HybridCLR.Editor.Installer public string HybridclrLocalVersion => _hybridclrLocalVersion != null ? _hybridclrLocalVersion : _hybridclrLocalVersion = GetHybridCLRLocalVersion(); + + public string HybridCLRRepoInstalledVersion + { + get { return EditorPrefs.GetString("hybridclr_repo"); } + set { EditorPrefs.SetString("hybridclr_repo", value); } + } + + public string Il2CppRepoInstalledVersion + { + get { return EditorPrefs.GetString("il2cpp_plus_repo"); } + set { EditorPrefs.SetString("il2cpp_plus_repo", value); } + } + + private string GetHybridCLRLocalVersion() { string workDir = SettingsUtil.HybridCLRDataDir; @@ -226,15 +240,7 @@ namespace HybridCLR.Editor.Installer string hybridclrRepoDir = $"{workDir}/{hybridclr_repo_path}"; { BashUtil.RemoveDir(hybridclrRepoDir); - string[] args = string.IsNullOrWhiteSpace(hybridclrVer) ? new string[] - { - "clone", - "--depth=1", - hybridclrRepoURL, - hybridclrRepoDir, - } - : - new string[] + string[] args = new string[] { "clone", "--depth=1", @@ -255,18 +261,7 @@ namespace HybridCLR.Editor.Installer string il2cppPlusRepoDir = $"{workDir}/{il2cpp_plus_repo_path}"; { BashUtil.RemoveDir(il2cppPlusRepoDir); - string[] args = string.IsNullOrWhiteSpace(il2cppPlusVer) ? - new string[] - { - "clone", - "--depth=1", - "-b", - $"{version.major}-main", - il2cppPlusRepoURL, - il2cppPlusRepoDir, - } - : - new string[] + string[] args = new string[] { "clone", "--depth=1", @@ -320,6 +315,8 @@ namespace HybridCLR.Editor.Installer Debug.Log("安装成功!"); _hybridclrLocalVersion = null; _il2cppPlusLocalVersion = null; + HybridCLRRepoInstalledVersion = hybridclrVer; + Il2CppRepoInstalledVersion = il2cppPlusVer; } else { diff --git a/Editor/Installer/InstallerWindow.cs b/Editor/Installer/InstallerWindow.cs index dbc4c42..0b3d1d5 100644 --- a/Editor/Installer/InstallerWindow.cs +++ b/Editor/Installer/InstallerWindow.cs @@ -10,12 +10,22 @@ namespace HybridCLR.Editor.Installer { private InstallerController _controller; - string _hybridclrVersion = ""; - string _il2cppPlusVersion = ""; + string _hybridclrVersion; + string _il2cppPlusVersion; private void OnEnable() { _controller = new InstallerController(); + _hybridclrVersion = _controller.HybridCLRRepoInstalledVersion; + if (string.IsNullOrWhiteSpace(_hybridclrVersion)) + { + _hybridclrVersion = "main"; + } + _il2cppPlusVersion = _controller.Il2CppRepoInstalledVersion; + if (string.IsNullOrWhiteSpace(_il2cppPlusVersion)) + { + _il2cppPlusVersion = $"{_controller.MajorVersion}-main"; + } } private void OnGUI() @@ -88,6 +98,14 @@ namespace HybridCLR.Editor.Installer Debug.LogError($"il2cpp 版本不兼容,最小版本为 {_controller.GetCurrentUnityVersionMinCompatibleVersionStr()}"); return; } + if (string.IsNullOrWhiteSpace(_hybridclrVersion)) + { + _hybridclrVersion = "main"; + } + if (string.IsNullOrWhiteSpace(_il2cppPlusVersion)) + { + _il2cppPlusVersion = $"{_controller.MajorVersion}-main"; + } _controller.InstallLocalHybridCLR(_hybridclrVersion, _il2cppPlusVersion); } } diff --git a/package.json b/package.json index cb818c3..39ee853 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.7", + "version": "1.1.8", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From 0edd8221019f3b1a097224b44b883def3ec7fb90 Mon Sep 17 00:00:00 2001 From: walon Date: Thu, 8 Dec 2022 22:19:27 +0800 Subject: [PATCH 11/19] =?UTF-8?q?[fix]=20=E4=BF=AE=E5=A4=8D=E7=94=9F?= =?UTF-8?q?=E6=88=90=E6=A1=A5=E6=8E=A5=E5=87=BD=E6=95=B0=E6=97=B6=E4=B8=8D?= =?UTF-8?q?=E5=BF=85=E8=A6=81=E5=9C=B0=E5=A4=9A=E6=AC=A1=E8=B0=83=E7=94=A8?= =?UTF-8?q?=20CleanIl2CppBuildCache=EF=BC=8C=E5=B9=B6=E6=9C=89=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E5=9B=A0=E5=B9=B6=E5=8F=91=E6=B8=85=E9=99=A4=E8=80=8C?= =?UTF-8?q?=E6=8A=9B=E5=87=BA=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Commands/MethodBridgeGeneratorCommand.cs | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Editor/Commands/MethodBridgeGeneratorCommand.cs b/Editor/Commands/MethodBridgeGeneratorCommand.cs index 053bf31..27fa016 100644 --- a/Editor/Commands/MethodBridgeGeneratorCommand.cs +++ b/Editor/Commands/MethodBridgeGeneratorCommand.cs @@ -42,7 +42,6 @@ namespace HybridCLR.Editor.Commands g.PrepareMethods(); g.Generate(); Debug.LogFormat("== output:{0} ==", outputFile); - CleanIl2CppBuildCache(); } [MenuItem("HybridCLR/Generate/MethodBridge", priority = 101)] @@ -92,6 +91,7 @@ namespace HybridCLR.Editor.Commands Task.WaitAll(tasks.ToArray()); } + CleanIl2CppBuildCache(); } } } diff --git a/package.json b/package.json index 39ee853..26f05d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.8", + "version": "1.1.9", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From a107f431734b3039efdafcbff61e3be7f5e7c00b Mon Sep 17 00:00:00 2001 From: walon Date: Mon, 12 Dec 2022 12:01:02 +0800 Subject: [PATCH 12/19] =?UTF-8?q?[fix]=20=E4=BF=AE=E5=A4=8D=E7=94=9F?= =?UTF-8?q?=E6=88=90N2M=E6=A1=A5=E6=8E=A5=E5=87=BD=E6=95=B0Stub=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=A4=B1=E8=AF=AF=E5=B0=86=E6=9C=AB=E5=B0=BE=E9=A1=B9?= =?UTF-8?q?=E7=9A=84sinature=E5=A1=AB=E6=88=90""=E7=9A=84bug=EF=BC=8C?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E5=BA=94=E8=AF=A5=E6=98=AFnullptr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/MethodBridge/PlatformGeneratorBase.cs | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Editor/MethodBridge/PlatformGeneratorBase.cs b/Editor/MethodBridge/PlatformGeneratorBase.cs index ac49452..7f13732 100644 --- a/Editor/MethodBridge/PlatformGeneratorBase.cs +++ b/Editor/MethodBridge/PlatformGeneratorBase.cs @@ -36,7 +36,7 @@ Managed2NativeMethodInfo hybridclr::interpreter::g_managed2nativeStub[] = lines.Add($"\t{{\"{method.CreateInvokeSigName()}\", __M2N_{method.CreateInvokeSigName()}}},"); } - lines.Add($"\t{{\"\", nullptr}},"); + lines.Add($"\t{{nullptr, nullptr}},"); lines.Add("};"); } diff --git a/package.json b/package.json index 26f05d5..1f8b76e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.9", + "version": "1.1.10", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From 8afdcb985d3725be16f10bfc1ae1c19ae6512862 Mon Sep 17 00:00:00 2001 From: walon Date: Mon, 12 Dec 2022 21:36:41 +0800 Subject: [PATCH 13/19] =?UTF-8?q?[fix]=20=E4=BF=AE=E5=A4=8D=20ReversePInvo?= =?UTF-8?q?keWrap=E7=94=9F=E6=88=90=E4=BB=A3=E7=A0=81=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/ReversePInvokeWrap/Generator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Editor/ReversePInvokeWrap/Generator.cs b/Editor/ReversePInvokeWrap/Generator.cs index 6556b66..ad9d263 100644 --- a/Editor/ReversePInvokeWrap/Generator.cs +++ b/Editor/ReversePInvokeWrap/Generator.cs @@ -29,7 +29,7 @@ namespace HybridCLR.Editor.ReversePInvokeWrap codes.Add($@" {method.ReturnInfo.Type.GetTypeName()} __ReversePInvokeMethod_{methodIndex}({paramDeclaringListWithoutMethodInfoStr}) {{ - const MethodInfo* method = MetadataModule::GetMethodInfoByReversePInvokeWrapperIndex({i}); + const MethodInfo* method = MetadataModule::GetMethodInfoByReversePInvokeWrapperIndex({methodIndex}); {methodTypeDef}; {(method.ReturnInfo.IsVoid ? "" : "return ")}((Callback)(method->methodPointerCallByInterp))({paramNameListWithoutMethodInfoStr}); }} From c8acfef61d5464d45cd6fe77cca33d1fe4d2502e Mon Sep 17 00:00:00 2001 From: walon Date: Tue, 13 Dec 2022 11:40:18 +0800 Subject: [PATCH 14/19] =?UTF-8?q?[fix]=20=E4=BF=AE=E5=A4=8D=20externalHotU?= =?UTF-8?q?pdateAssembliyDirs=20=E6=97=A0=E6=B3=95=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BuildProcessors/FilterHotFixAssemblies.cs | 7 ++++-- Editor/Commands/LinkGeneratorCommand.cs | 23 +++---------------- .../Commands/MethodBridgeGeneratorCommand.cs | 9 +++----- Editor/Link/Analyzer.cs | 8 +++---- Editor/Meta/MetaUtil.cs | 19 +++++++++++++++ Editor/Meta/UnityEditorAssemblyResolver.cs | 6 ++++- package.json | 2 +- 7 files changed, 40 insertions(+), 34 deletions(-) diff --git a/Editor/BuildProcessors/FilterHotFixAssemblies.cs b/Editor/BuildProcessors/FilterHotFixAssemblies.cs index bd6cdc5..2488179 100644 --- a/Editor/BuildProcessors/FilterHotFixAssemblies.cs +++ b/Editor/BuildProcessors/FilterHotFixAssemblies.cs @@ -1,4 +1,5 @@ -using System; +using HybridCLR.Editor.Meta; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -35,10 +36,12 @@ namespace HybridCLR.Editor.BuildProcessors } } + var assResolver = MetaUtil.CreateHotUpdateAssemblyResolver(EditorUserBuildSettings.activeBuildTarget); // 检查是否填写了正确的dll名称 foreach (var hotUpdateDll in allHotUpdateDllFiles) { - if (assemblies.All(ass => !ass.EndsWith(hotUpdateDll))) + string hotUpdateAssName = hotUpdateDll.Substring(0, hotUpdateDll.Length - 4); + if (assemblies.All(ass => !ass.EndsWith(hotUpdateDll)) && string.IsNullOrEmpty(assResolver.ResolveAssembly(hotUpdateAssName, false))) { throw new Exception($"热更新 assembly:{hotUpdateDll} 不存在,请检查拼写错误"); } diff --git a/Editor/Commands/LinkGeneratorCommand.cs b/Editor/Commands/LinkGeneratorCommand.cs index 81acaa7..4d6a16f 100644 --- a/Editor/Commands/LinkGeneratorCommand.cs +++ b/Editor/Commands/LinkGeneratorCommand.cs @@ -26,29 +26,12 @@ namespace HybridCLR.Editor.Commands var ls = SettingsUtil.HybridCLRSettings; - var allAssByNames = new Dictionary(); - foreach (var ass in AppDomain.CurrentDomain.GetAssemblies()) - { - allAssByNames[ass.GetName().Name] = ass; - } - - var hotfixAssembles = new List(); - foreach(var assName in SettingsUtil.HotUpdateAssemblyNames) - { - if (allAssByNames.TryGetValue(assName, out var ass)) - { - hotfixAssembles.Add(ass); - } - else - { - throw new Exception($"assembly:{assName} 不存在"); - } - } + List hotfixAssemblies = SettingsUtil.HotUpdateAssemblyNames; var analyzer = new Analyzer(Meta.MetaUtil.CreateBuildTargetAssemblyResolver(EditorUserBuildSettings.activeBuildTarget), HybridCLRSettings.Instance.collectAssetReferenceTypes); - var refTypes = analyzer.CollectRefs(hotfixAssembles); + var refTypes = analyzer.CollectRefs(hotfixAssemblies); - Debug.Log($"[LinkGeneratorCommand] hotfix assembly count:{hotfixAssembles.Count}, ref type count:{refTypes.Count} output:{Application.dataPath}/{ls.outputLinkFile}"); + Debug.Log($"[LinkGeneratorCommand] hotfix assembly count:{hotfixAssemblies.Count}, ref type count:{refTypes.Count} output:{Application.dataPath}/{ls.outputLinkFile}"); var linkXmlWriter = new LinkXmlWriter(); linkXmlWriter.Write($"{Application.dataPath}/{ls.outputLinkFile}", refTypes); AssetDatabase.Refresh(); diff --git a/Editor/Commands/MethodBridgeGeneratorCommand.cs b/Editor/Commands/MethodBridgeGeneratorCommand.cs index 27fa016..6fb3270 100644 --- a/Editor/Commands/MethodBridgeGeneratorCommand.cs +++ b/Editor/Commands/MethodBridgeGeneratorCommand.cs @@ -52,12 +52,9 @@ namespace HybridCLR.Editor.Commands static IAssemblyResolver CreateBuildTargetAssemblyResolver(BuildTarget target) { - return new CombinedAssemblyResolver(new PathAssemblyResolver( - SettingsUtil.GetAssembliesPostIl2CppStripDir(target), - SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target)), - new UnityPluginAssemblyResolver(), - new UnityDotNetAOTAssemblyResolver(), - new UnityEditorAssemblyResolver() + return new CombinedAssemblyResolver( + new PathAssemblyResolver(SettingsUtil.GetAssembliesPostIl2CppStripDir(target)), + MetaUtil.CreateHotUpdateAssemblyResolver(target) ); } diff --git a/Editor/Link/Analyzer.cs b/Editor/Link/Analyzer.cs index 9b6d417..4472c2a 100644 --- a/Editor/Link/Analyzer.cs +++ b/Editor/Link/Analyzer.cs @@ -22,23 +22,23 @@ namespace HybridCLR.Editor.Link _analyzeAssetType = analyzeAssetType; } - public HashSet CollectRefs(List rootAssemblies) + public HashSet CollectRefs(List rootAssemblies) { using (var assCollector = new AssemblyCache(_resolver)) { var rootAssemblyName = new HashSet(); foreach (var ass in rootAssemblies) { - if (!rootAssemblyName.Add(ass.GetName().Name)) + if (!rootAssemblyName.Add(ass)) { - throw new Exception($"assembly:{ass.GetName().Name} 重复"); + throw new Exception($"assembly:{ass} 重复"); } } var typeRefs = new HashSet(TypeEqualityComparer.Instance); foreach (var rootAss in rootAssemblies) { - var dnAss = assCollector.LoadModule(rootAss.GetName().Name); + var dnAss = assCollector.LoadModule(rootAss); foreach (var type in dnAss.GetTypeRefs()) { if (!rootAssemblyName.Contains(type.DefinitionAssembly.Name)) diff --git a/Editor/Meta/MetaUtil.cs b/Editor/Meta/MetaUtil.cs index 233ff88..b325563 100644 --- a/Editor/Meta/MetaUtil.cs +++ b/Editor/Meta/MetaUtil.cs @@ -141,6 +141,25 @@ namespace HybridCLR.Editor.Meta } } + public static IAssemblyResolver CreateExternalAssemblyResolver(BuildTarget target) + { + var externalDirs = HybridCLRSettings.Instance.externalHotUpdateAssembliyDirs; + if (externalDirs == null || externalDirs.Length == 0) + { + return new PathAssemblyResolver(); + } + else + { + var externalDirList = new List(); + foreach (var dir in externalDirs) + { + externalDirList.Add($"{dir}/{target}"); + externalDirList.Add(dir); + } + return new PathAssemblyResolver(externalDirList.ToArray()); + } + } + public static IAssemblyResolver CreateBuildTargetAssemblyResolver(BuildTarget target) { return new CombinedAssemblyResolver(CreateHotUpdateAssemblyResolver(target), diff --git a/Editor/Meta/UnityEditorAssemblyResolver.cs b/Editor/Meta/UnityEditorAssemblyResolver.cs index 092d925..7057249 100644 --- a/Editor/Meta/UnityEditorAssemblyResolver.cs +++ b/Editor/Meta/UnityEditorAssemblyResolver.cs @@ -16,7 +16,11 @@ namespace HybridCLR.Editor.Meta { return refAss.Location; } - return Assembly.Load(assemblyName).Location; + if (throwExIfNotFind) + { + throw new Exception($"resolve assembly:{assemblyName} fail"); + } + return null; } } } diff --git a/package.json b/package.json index 1f8b76e..127f53c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.10", + "version": "1.1.11", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From b40d62e16ee2325dacdc0cf89cff67ebb425d2cb Mon Sep 17 00:00:00 2001 From: walon Date: Tue, 13 Dec 2022 18:10:20 +0800 Subject: [PATCH 15/19] =?UTF-8?q?[opt]=20=E4=BC=98=E5=8C=96link.xml?= =?UTF-8?q?=E7=94=9F=E6=88=90=EF=BC=8C=E5=8F=AA=E5=8A=A0=E8=BD=BD=E7=83=AD?= =?UTF-8?q?=E6=9B=B4=E6=96=B0dll=EF=BC=8C=E4=B8=8D=E5=86=8D=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E5=AE=83=E4=BB=AC=E4=BE=9D=E8=B5=96=E7=9A=84=E5=85=B6?= =?UTF-8?q?=E4=BB=96dll?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Link/Analyzer.cs | 4 ++-- Editor/Meta/AssemblyCache.cs | 10 +++++++--- package.json | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Editor/Link/Analyzer.cs b/Editor/Link/Analyzer.cs index 4472c2a..71b1cbf 100644 --- a/Editor/Link/Analyzer.cs +++ b/Editor/Link/Analyzer.cs @@ -38,10 +38,10 @@ namespace HybridCLR.Editor.Link var typeRefs = new HashSet(TypeEqualityComparer.Instance); foreach (var rootAss in rootAssemblies) { - var dnAss = assCollector.LoadModule(rootAss); + var dnAss = assCollector.LoadModule(rootAss, _analyzeAssetType); foreach (var type in dnAss.GetTypeRefs()) { - if (!rootAssemblyName.Contains(type.DefinitionAssembly.Name)) + if (!rootAssemblyName.Contains(type.DefinitionAssembly.Name.ToString())) { typeRefs.Add(type); } diff --git a/Editor/Meta/AssemblyCache.cs b/Editor/Meta/AssemblyCache.cs index 646f966..04a7442 100644 --- a/Editor/Meta/AssemblyCache.cs +++ b/Editor/Meta/AssemblyCache.cs @@ -27,7 +27,7 @@ namespace HybridCLR.Editor.Meta _asmResolver.UseGAC = false; } - public ModuleDefMD LoadModule(string moduleName) + public ModuleDefMD LoadModule(string moduleName, bool loadReferenceAssemblies = true) { // Debug.Log($"load module:{moduleName}"); if (LoadedModules.TryGetValue(moduleName, out var mod)) @@ -37,10 +37,14 @@ namespace HybridCLR.Editor.Meta mod = DoLoadModule(_assemblyPathResolver.ResolveAssembly(moduleName, true)); LoadedModules.Add(moduleName, mod); - foreach (var refAsm in mod.GetAssemblyRefs()) + if (loadReferenceAssemblies) { - LoadModule(refAsm.Name); + foreach (var refAsm in mod.GetAssemblyRefs()) + { + LoadModule(refAsm.Name); + } } + return mod; } diff --git a/package.json b/package.json index 127f53c..029349b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.11", + "version": "1.1.12", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From 947b15e7d9cd6906f3b29aeb314229b534efe385 Mon Sep 17 00:00:00 2001 From: walon Date: Wed, 14 Dec 2022 10:21:31 +0800 Subject: [PATCH 16/19] =?UTF-8?q?[fix]=20=E4=BF=AE=E5=A4=8DStructLayout?= =?UTF-8?q?=E4=B8=AD=E5=8F=AA=E6=8C=87=E5=AE=9ALayoutKind=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E6=97=B6=EF=BC=8Cstruct=E7=9A=84ClassLayout=E4=B8=BA?= =?UTF-8?q?=E7=A9=BA=EF=BC=8C=E8=AE=A1=E7=AE=97type=20size=E5=92=8Caligmen?= =?UTF-8?q?t=E9=94=99=E8=AF=AF=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/ABI/TypeCreatorBase.cs | 5 +++++ Editor/ABI/ValueTypeSizeAligmentCalculator.cs | 6 +++--- package.json | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Editor/ABI/TypeCreatorBase.cs b/Editor/ABI/TypeCreatorBase.cs index 54b3ffd..9c98490 100644 --- a/Editor/ABI/TypeCreatorBase.cs +++ b/Editor/ABI/TypeCreatorBase.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using UnityEngine; namespace HybridCLR.Editor.ABI { @@ -74,6 +75,10 @@ namespace HybridCLR.Editor.ABI case ElementType.ValueType: { TypeDef typeDef = type.ToTypeDefOrRef().ResolveTypeDef(); + if (typeDef == null) + { + throw new Exception($"type:{type} 未能找到定义。请尝试 `HybridCLR/Genergate/LinkXml`,然后Build一次生成AOT dll,再重新生成桥接函数"); + } if (typeDef.IsEnum) { return CreateTypeInfo(typeDef.GetEnumUnderlyingType()); diff --git a/Editor/ABI/ValueTypeSizeAligmentCalculator.cs b/Editor/ABI/ValueTypeSizeAligmentCalculator.cs index 5162271..a97dd02 100644 --- a/Editor/ABI/ValueTypeSizeAligmentCalculator.cs +++ b/Editor/ABI/ValueTypeSizeAligmentCalculator.cs @@ -74,11 +74,11 @@ namespace HybridCLR.Editor.ABI { continue; } - if (sa != null && typeDef.Layout.HasFlag(dnlib.DotNet.TypeAttributes.ExplicitLayout)) + if (typeDef.Layout.HasFlag(dnlib.DotNet.TypeAttributes.ExplicitLayout)) { int offset = (int)field.FieldOffset.Value; totalSize = Math.Max(totalSize, offset + fs); - if (offset > sa.ClassSize) + if (sa != null && offset > sa.ClassSize) { useSLSize = false; } @@ -90,7 +90,7 @@ namespace HybridCLR.Editor.ABI totalSize = (totalSize + fa - 1) / fa * fa; } totalSize += fs; - if (sa != null && typeDef.Layout.HasFlag(dnlib.DotNet.TypeAttributes.SequentialLayout) && totalSize > sa.ClassSize) + if (sa != null && totalSize > sa.ClassSize) { useSLSize = false; } diff --git a/package.json b/package.json index 029349b..2ad77f6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.12", + "version": "1.1.13", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From 00f94335c3a2640e1ae9b20c678c62ac47eceaa7 Mon Sep 17 00:00:00 2001 From: walon Date: Wed, 14 Dec 2022 14:11:32 +0800 Subject: [PATCH 17/19] =?UTF-8?q?[refactor]=20=E9=87=8D=E6=9E=84=E5=B9=B6?= =?UTF-8?q?=E4=B8=94=E4=BF=AE=E5=A4=8D=E4=BA=86Generate=E7=9B=B8=E5=85=B3A?= =?UTF-8?q?ssembly=20Resolve=E6=BD=9C=E5=9C=A8=E7=9A=84bug=E3=80=82=20[opt?= =?UTF-8?q?]=20=E4=BC=98=E5=8C=96=20PrebuildCommand.Build=20=E4=B8=AD?= =?UTF-8?q?=E5=A4=9A=E6=AC=A1=E7=BC=96=E8=AF=91=E7=83=AD=E6=9B=B4=E6=96=B0?= =?UTF-8?q?dll=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E5=A4=A7=E5=B9=85?= =?UTF-8?q?=E7=BC=A9=E7=9F=AD=E4=BA=86=E6=97=B6=E9=97=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BuildProcessors/FilterHotFixAssemblies.cs | 19 +++---- .../Commands/AOTReferenceGeneratorCommand.cs | 18 +++---- Editor/Commands/Il2CppDefGeneratorCommand.cs | 2 +- Editor/Commands/LinkGeneratorCommand.cs | 14 +++-- .../Commands/MethodBridgeGeneratorCommand.cs | 28 ++++------ Editor/Commands/PrebuildCommand.cs | 16 +++--- .../ReversePInvokeWrapperGeneratorCommand.cs | 16 ++++-- Editor/Link/Analyzer.cs | 13 ++--- Editor/Meta/AssemblyResolverBase.cs | 26 ++++++++++ ...r.cs.meta => AssemblyResolverBase.cs.meta} | 2 +- Editor/Meta/CombinedAssemblyResolver.cs | 14 +++-- Editor/Meta/FixedSetAssemblyResolver.cs | 37 ++++++++++++++ ....meta => FixedSetAssemblyResolver.cs.meta} | 2 +- Editor/Meta/MetaUtil.cs | 51 +++++++------------ Editor/Meta/PathAssemblyResolver.cs | 14 +++-- Editor/Meta/UnityDotNetAOTAssemblyResolver.cs | 43 ---------------- Editor/Meta/UnityEditorAssemblyResolver.cs | 26 ---------- .../Meta/UnityEditorAssemblyResolver.cs.meta | 11 ---- Editor/Meta/UnityPluginAssemblyResolver.cs | 44 ---------------- package.json | 2 +- 20 files changed, 154 insertions(+), 244 deletions(-) create mode 100644 Editor/Meta/AssemblyResolverBase.cs rename Editor/Meta/{UnityPluginAssemblyResolver.cs.meta => AssemblyResolverBase.cs.meta} (83%) create mode 100644 Editor/Meta/FixedSetAssemblyResolver.cs rename Editor/Meta/{UnityDotNetAOTAssemblyResolver.cs.meta => FixedSetAssemblyResolver.cs.meta} (83%) delete mode 100644 Editor/Meta/UnityDotNetAOTAssemblyResolver.cs delete mode 100644 Editor/Meta/UnityEditorAssemblyResolver.cs delete mode 100644 Editor/Meta/UnityEditorAssemblyResolver.cs.meta delete mode 100644 Editor/Meta/UnityPluginAssemblyResolver.cs diff --git a/Editor/BuildProcessors/FilterHotFixAssemblies.cs b/Editor/BuildProcessors/FilterHotFixAssemblies.cs index 2488179..db1184d 100644 --- a/Editor/BuildProcessors/FilterHotFixAssemblies.cs +++ b/Editor/BuildProcessors/FilterHotFixAssemblies.cs @@ -24,11 +24,12 @@ namespace HybridCLR.Editor.BuildProcessors Debug.Log($"[FilterHotFixAssemblies] disabled"); return assemblies; } - List allHotUpdateDllFiles = SettingsUtil.HotUpdateAssemblyFiles; + List allHotUpdateDllNames = SettingsUtil.HotUpdateAssemblyNames; + List allHotupdateDllFiles = SettingsUtil.HotUpdateAssemblyFiles; // 检查是否重复填写 var hotUpdateDllSet = new HashSet(); - foreach(var hotUpdateDll in allHotUpdateDllFiles) + foreach(var hotUpdateDll in allHotUpdateDllNames) { if (!hotUpdateDllSet.Add(hotUpdateDll)) { @@ -36,20 +37,20 @@ namespace HybridCLR.Editor.BuildProcessors } } - var assResolver = MetaUtil.CreateHotUpdateAssemblyResolver(EditorUserBuildSettings.activeBuildTarget); + var assResolver = MetaUtil.CreateHotUpdateAssemblyResolver(EditorUserBuildSettings.activeBuildTarget, allHotUpdateDllNames); // 检查是否填写了正确的dll名称 - foreach (var hotUpdateDll in allHotUpdateDllFiles) + foreach (var hotUpdateDllName in allHotUpdateDllNames) { - string hotUpdateAssName = hotUpdateDll.Substring(0, hotUpdateDll.Length - 4); - if (assemblies.All(ass => !ass.EndsWith(hotUpdateDll)) && string.IsNullOrEmpty(assResolver.ResolveAssembly(hotUpdateAssName, false))) + string hotUpdateDllFile = hotUpdateDllName + ".dll"; + if (assemblies.All(ass => !ass.EndsWith(hotUpdateDllFile)) && string.IsNullOrEmpty(assResolver.ResolveAssembly(hotUpdateDllName, false))) { - throw new Exception($"热更新 assembly:{hotUpdateDll} 不存在,请检查拼写错误"); + throw new Exception($"热更新 assembly:{hotUpdateDllFile} 不存在,请检查拼写错误"); } - Debug.Log($"[FilterHotFixAssemblies] 过滤热更新assembly:{hotUpdateDll}"); + Debug.Log($"[FilterHotFixAssemblies] 过滤热更新assembly:{hotUpdateDllFile}"); } // 将热更dll从打包列表中移除 - return assemblies.Where(ass => allHotUpdateDllFiles.All(dll => !ass.EndsWith(dll, StringComparison.OrdinalIgnoreCase))).ToArray(); + return assemblies.Where(ass => allHotupdateDllFiles.All(dll => !ass.EndsWith(dll, StringComparison.OrdinalIgnoreCase))).ToArray(); } } } diff --git a/Editor/Commands/AOTReferenceGeneratorCommand.cs b/Editor/Commands/AOTReferenceGeneratorCommand.cs index a56d12f..11e10ad 100644 --- a/Editor/Commands/AOTReferenceGeneratorCommand.cs +++ b/Editor/Commands/AOTReferenceGeneratorCommand.cs @@ -14,23 +14,19 @@ namespace HybridCLR.Editor.Commands { [MenuItem("HybridCLR/Generate/AOTGenericReference", priority = 102)] - public static void GenerateAOTGenericReference() + public static void CompileAndGenerateAOTGenericReference() { - GenerateAOTGenericReference(true); + BuildTarget target = EditorUserBuildSettings.activeBuildTarget; + CompileDllCommand.CompileDll(target); + GenerateAOTGenericReference(target); } - public static void GenerateAOTGenericReference(bool compileDll) + public static void GenerateAOTGenericReference(BuildTarget target) { - // 此处理论会有点问题,打每个平台的时候,都得针对当前平台生成桥接函数 - // 但影响不大,先这样吧 - if (compileDll) - { - CompileDllCommand.CompileDllActiveBuildTarget(); - } - var gs = SettingsUtil.HybridCLRSettings; + List hotUpdateDllNames = SettingsUtil.HotUpdateAssemblyNames; - using (AssemblyReferenceDeepCollector collector = new AssemblyReferenceDeepCollector(MetaUtil.CreateBuildTargetAssemblyResolver(EditorUserBuildSettings.activeBuildTarget), SettingsUtil.HotUpdateAssemblyNames)) + using (AssemblyReferenceDeepCollector collector = new AssemblyReferenceDeepCollector(MetaUtil.CreateHotUpdateAndAOTAssemblyResolver(target, hotUpdateDllNames), hotUpdateDllNames)) { var analyzer = new Analyzer(new Analyzer.Options { diff --git a/Editor/Commands/Il2CppDefGeneratorCommand.cs b/Editor/Commands/Il2CppDefGeneratorCommand.cs index b503aa1..6a9e175 100644 --- a/Editor/Commands/Il2CppDefGeneratorCommand.cs +++ b/Editor/Commands/Il2CppDefGeneratorCommand.cs @@ -17,7 +17,7 @@ namespace HybridCLR.Editor.Commands { var options = new Il2CppDef.Il2CppDefGenerator.Options() { - UnityVersion = UnityEngine.Application.unityVersion, + UnityVersion = Application.unityVersion, OutputFile = $"{SettingsUtil.LocalIl2CppDir}/libil2cpp/il2cpp-config.h", }; diff --git a/Editor/Commands/LinkGeneratorCommand.cs b/Editor/Commands/LinkGeneratorCommand.cs index 4d6a16f..68217ea 100644 --- a/Editor/Commands/LinkGeneratorCommand.cs +++ b/Editor/Commands/LinkGeneratorCommand.cs @@ -1,4 +1,5 @@ using HybridCLR.Editor.Link; +using HybridCLR.Editor.Meta; using System; using System.Collections.Generic; using System.Reflection; @@ -14,21 +15,18 @@ namespace HybridCLR.Editor.Commands [MenuItem("HybridCLR/Generate/LinkXml", priority = 100)] public static void GenerateLinkXml() { - GenerateLinkXml(true); + BuildTarget target = EditorUserBuildSettings.activeBuildTarget; + CompileDllCommand.CompileDll(target); + GenerateLinkXml(target); } - public static void GenerateLinkXml(bool compileDll) + public static void GenerateLinkXml(BuildTarget target) { - if (compileDll) - { - CompileDllCommand.CompileDllActiveBuildTarget(); - } - var ls = SettingsUtil.HybridCLRSettings; List hotfixAssemblies = SettingsUtil.HotUpdateAssemblyNames; - var analyzer = new Analyzer(Meta.MetaUtil.CreateBuildTargetAssemblyResolver(EditorUserBuildSettings.activeBuildTarget), HybridCLRSettings.Instance.collectAssetReferenceTypes); + var analyzer = new Analyzer(MetaUtil.CreateHotUpdateAndAOTAssemblyResolver(target, hotfixAssemblies), HybridCLRSettings.Instance.collectAssetReferenceTypes); var refTypes = analyzer.CollectRefs(hotfixAssemblies); Debug.Log($"[LinkGeneratorCommand] hotfix assembly count:{hotfixAssemblies.Count}, ref type count:{refTypes.Count} output:{Application.dataPath}/{ls.outputLinkFile}"); diff --git a/Editor/Commands/MethodBridgeGeneratorCommand.cs b/Editor/Commands/MethodBridgeGeneratorCommand.cs index 6fb3270..e0c7447 100644 --- a/Editor/Commands/MethodBridgeGeneratorCommand.cs +++ b/Editor/Commands/MethodBridgeGeneratorCommand.cs @@ -45,27 +45,17 @@ namespace HybridCLR.Editor.Commands } [MenuItem("HybridCLR/Generate/MethodBridge", priority = 101)] - public static void GenerateMethodBridge() - { - GenerateMethodBridge(true); - } - - static IAssemblyResolver CreateBuildTargetAssemblyResolver(BuildTarget target) - { - return new CombinedAssemblyResolver( - new PathAssemblyResolver(SettingsUtil.GetAssembliesPostIl2CppStripDir(target)), - MetaUtil.CreateHotUpdateAssemblyResolver(target) - ); - } - - public static void GenerateMethodBridge(bool compileDll) + public static void CompileAndGenerateMethodBridge() { BuildTarget target = EditorUserBuildSettings.activeBuildTarget; - if (compileDll) - { - CompileDllCommand.CompileDllActiveBuildTarget(); - } - using (AssemblyReferenceDeepCollector collector = new AssemblyReferenceDeepCollector(CreateBuildTargetAssemblyResolver(target), SettingsUtil.HotUpdateAssemblyNames)) + CompileDllCommand.CompileDll(target); + GenerateMethodBridge(target); + } + + public static void GenerateMethodBridge(BuildTarget target) + { + List hotUpdateDllNames = SettingsUtil.HotUpdateAssemblyNames; + using (AssemblyReferenceDeepCollector collector = new AssemblyReferenceDeepCollector(MetaUtil.CreateHotUpdateAndAOTAssemblyResolver(target, hotUpdateDllNames), hotUpdateDllNames)) { var analyzer = new Analyzer(new Analyzer.Options { diff --git a/Editor/Commands/PrebuildCommand.cs b/Editor/Commands/PrebuildCommand.cs index d2a64d5..30bf910 100644 --- a/Editor/Commands/PrebuildCommand.cs +++ b/Editor/Commands/PrebuildCommand.cs @@ -15,16 +15,18 @@ namespace HybridCLR.Editor.Commands [MenuItem("HybridCLR/Generate/All", priority = 200)] public static void GenerateAll() { + BuildTarget target = EditorUserBuildSettings.activeBuildTarget; + CompileDllCommand.CompileDll(target); + Il2CppDefGeneratorCommand.GenerateIl2CppDef(); - // 顺序随意 - ReversePInvokeWrapperGeneratorCommand.GenerateReversePInvokeWrapper(); - // AOTReferenceGeneratorCommand 涉及到代码生成,必须在MethodBridgeGeneratorCommand之前 - AOTReferenceGeneratorCommand.GenerateAOTGenericReference(); - MethodBridgeGeneratorCommand.GenerateMethodBridge(); + // 这几个生成依赖HotUpdateDlls + LinkGeneratorCommand.GenerateLinkXml(target); + ReversePInvokeWrapperGeneratorCommand.GenerateReversePInvokeWrapper(target); + AOTReferenceGeneratorCommand.GenerateAOTGenericReference(target); - // 顺序随意,只要保证 GenerateLinkXml之前有调用过CompileDll即可 - LinkGeneratorCommand.GenerateLinkXml(false); + // 桥接函数生成依赖于AOT dll,必须保证已经build过,生成AOT dll + MethodBridgeGeneratorCommand.GenerateMethodBridge(target); } } } diff --git a/Editor/Commands/ReversePInvokeWrapperGeneratorCommand.cs b/Editor/Commands/ReversePInvokeWrapperGeneratorCommand.cs index 706c019..4f097ef 100644 --- a/Editor/Commands/ReversePInvokeWrapperGeneratorCommand.cs +++ b/Editor/Commands/ReversePInvokeWrapperGeneratorCommand.cs @@ -19,12 +19,20 @@ namespace HybridCLR.Editor.Commands { [MenuItem("HybridCLR/Generate/ReversePInvokeWrapper", priority = 103)] - public static void GenerateReversePInvokeWrapper() + + public static void CompileAndGenerateReversePInvokeWrapper() { - CompileDllCommand.CompileDllActiveBuildTarget(); - using (var cache = new AssemblyCache(MetaUtil.CreateBuildTargetAssemblyResolver(EditorUserBuildSettings.activeBuildTarget))) + BuildTarget target = EditorUserBuildSettings.activeBuildTarget; + CompileDllCommand.CompileDll(target); + GenerateReversePInvokeWrapper(target); + } + + public static void GenerateReversePInvokeWrapper(BuildTarget target) + { + List hotUpdateDlls = SettingsUtil.HotUpdateAssemblyNames; + using (var cache = new AssemblyCache(MetaUtil.CreateHotUpdateAndAOTAssemblyResolver(target, hotUpdateDlls))) { - var analyzer = new ReversePInvokeWrap.Analyzer(cache, SettingsUtil.HotUpdateAssemblyNames); + var analyzer = new ReversePInvokeWrap.Analyzer(cache, hotUpdateDlls); analyzer.Run(); diff --git a/Editor/Link/Analyzer.cs b/Editor/Link/Analyzer.cs index 71b1cbf..cb1ea70 100644 --- a/Editor/Link/Analyzer.cs +++ b/Editor/Link/Analyzer.cs @@ -26,14 +26,7 @@ namespace HybridCLR.Editor.Link { using (var assCollector = new AssemblyCache(_resolver)) { - var rootAssemblyName = new HashSet(); - foreach (var ass in rootAssemblies) - { - if (!rootAssemblyName.Add(ass)) - { - throw new Exception($"assembly:{ass} 重复"); - } - } + var rootAssemblyNames = new HashSet(rootAssemblies); var typeRefs = new HashSet(TypeEqualityComparer.Instance); foreach (var rootAss in rootAssemblies) @@ -41,7 +34,7 @@ namespace HybridCLR.Editor.Link var dnAss = assCollector.LoadModule(rootAss, _analyzeAssetType); foreach (var type in dnAss.GetTypeRefs()) { - if (!rootAssemblyName.Contains(type.DefinitionAssembly.Name.ToString())) + if (!rootAssemblyNames.Contains(type.DefinitionAssembly.Name.ToString())) { typeRefs.Add(type); } @@ -51,7 +44,7 @@ namespace HybridCLR.Editor.Link if (_analyzeAssetType) { var modsExludeRoots = assCollector.LoadedModules - .Where(e => !rootAssemblyName.Contains(e.Key)) + .Where(e => !rootAssemblyNames.Contains(e.Key)) .ToDictionary(e => e.Key, e => e.Value); CollectObjectTypeInAssets(modsExludeRoots, typeRefs); } diff --git a/Editor/Meta/AssemblyResolverBase.cs b/Editor/Meta/AssemblyResolverBase.cs new file mode 100644 index 0000000..c8fc03f --- /dev/null +++ b/Editor/Meta/AssemblyResolverBase.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HybridCLR.Editor.Meta +{ + public abstract class AssemblyResolverBase : IAssemblyResolver + { + public string ResolveAssembly(string assemblyName, bool throwExIfNotFind) + { + if (TryResolveAssembly(assemblyName, out string assemblyPath)) + { + return assemblyPath; + } + if (throwExIfNotFind) + { + throw new Exception($"resolve assembly:{assemblyName} 失败! 如果是热更新dll找不到,请先运行`HybridCLR/CompileDll/ActiveBuildTarget`编译生成热更新dll。如果是AOT dll找不到,请先运行`HybridCLR/Generate/LinkXml`,接着在`Build Settings`中打包或者导出工程来生成AOT dll"); + } + return null; + } + + protected abstract bool TryResolveAssembly(string assemblyName, out string assemblyPath); + } +} diff --git a/Editor/Meta/UnityPluginAssemblyResolver.cs.meta b/Editor/Meta/AssemblyResolverBase.cs.meta similarity index 83% rename from Editor/Meta/UnityPluginAssemblyResolver.cs.meta rename to Editor/Meta/AssemblyResolverBase.cs.meta index 707e174..e153d4e 100644 --- a/Editor/Meta/UnityPluginAssemblyResolver.cs.meta +++ b/Editor/Meta/AssemblyResolverBase.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 6c235be11c219a74fa5eb55ed54e7662 +guid: 5f8d48774b790364cbd36f1f68fd6614 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Editor/Meta/CombinedAssemblyResolver.cs b/Editor/Meta/CombinedAssemblyResolver.cs index c8f663a..31a0c51 100644 --- a/Editor/Meta/CombinedAssemblyResolver.cs +++ b/Editor/Meta/CombinedAssemblyResolver.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace HybridCLR.Editor.Meta { - public class CombinedAssemblyResolver : IAssemblyResolver + public class CombinedAssemblyResolver : AssemblyResolverBase { private readonly IAssemblyResolver[] _resolvers; @@ -15,21 +15,19 @@ namespace HybridCLR.Editor.Meta _resolvers = resolvers; } - public string ResolveAssembly(string assemblyName, bool throwExIfNotFind) + protected override bool TryResolveAssembly(string assemblyName, out string assemblyPath) { foreach(var resolver in _resolvers) { var assembly = resolver.ResolveAssembly(assemblyName, false); if (assembly != null) { - return assembly; + assemblyPath = assembly; + return true; } } - if (throwExIfNotFind) - { - throw new Exception($"resolve assembly:{assemblyName} fail"); - } - return null; + assemblyPath = null; + return false; } } } diff --git a/Editor/Meta/FixedSetAssemblyResolver.cs b/Editor/Meta/FixedSetAssemblyResolver.cs new file mode 100644 index 0000000..5bee4e4 --- /dev/null +++ b/Editor/Meta/FixedSetAssemblyResolver.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace HybridCLR.Editor.Meta +{ + public class FixedSetAssemblyResolver : AssemblyResolverBase + { + private readonly string _rootDir; + private readonly HashSet _fileNames; + + public FixedSetAssemblyResolver(string rootDir, IEnumerable fileNameNotExts) + { + _rootDir = rootDir; + _fileNames = new HashSet(fileNameNotExts); + } + + protected override bool TryResolveAssembly(string assemblyName, out string assemblyPath) + { + if (_fileNames.Contains(assemblyName)) + { + assemblyPath = $"{_rootDir}/{assemblyName}.dll"; + if (File.Exists(assemblyPath)) + { + Debug.Log($"[FixedSetAssemblyResolver] resolve:{assemblyName} path:{assemblyPath}"); + return true; + } + } + assemblyPath = null; + return false; + } + } +} diff --git a/Editor/Meta/UnityDotNetAOTAssemblyResolver.cs.meta b/Editor/Meta/FixedSetAssemblyResolver.cs.meta similarity index 83% rename from Editor/Meta/UnityDotNetAOTAssemblyResolver.cs.meta rename to Editor/Meta/FixedSetAssemblyResolver.cs.meta index ce41f39..cc4fb61 100644 --- a/Editor/Meta/UnityDotNetAOTAssemblyResolver.cs.meta +++ b/Editor/Meta/FixedSetAssemblyResolver.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 87ece9687eaa17648bdc9d2c9bf30520 +guid: f135accd10f42c64b9735c3aa8cb1e77 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Editor/Meta/MetaUtil.cs b/Editor/Meta/MetaUtil.cs index b325563..539eb91 100644 --- a/Editor/Meta/MetaUtil.cs +++ b/Editor/Meta/MetaUtil.cs @@ -120,52 +120,39 @@ namespace HybridCLR.Editor.Meta return typeSigs.Select(s => ToShareTypeSig(s)).ToList(); } - public static IAssemblyResolver CreateHotUpdateAssemblyResolver(BuildTarget target) + public static IAssemblyResolver CreateHotUpdateAssemblyResolver(BuildTarget target, List hotUpdateDlls) { var externalDirs = HybridCLRSettings.Instance.externalHotUpdateAssembliyDirs; var defaultHotUpdateOutputDir = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target); + IAssemblyResolver defaultHotUpdateResolver = new FixedSetAssemblyResolver(defaultHotUpdateOutputDir, hotUpdateDlls); if (externalDirs == null || externalDirs.Length == 0) { - return new PathAssemblyResolver(defaultHotUpdateOutputDir); + return defaultHotUpdateResolver; } else { - var externalDirList = new List(); + var resolvers = new List(); foreach (var dir in externalDirs) { - externalDirList.Add($"{dir}/{target}"); - externalDirList.Add(dir); + resolvers.Add(new FixedSetAssemblyResolver($"{dir}/{target}", hotUpdateDlls)); + resolvers.Add(new FixedSetAssemblyResolver(dir, hotUpdateDlls)); } - externalDirList.Add(defaultHotUpdateOutputDir); - return new PathAssemblyResolver(externalDirList.ToArray()); + resolvers.Add(defaultHotUpdateResolver); + return new CombinedAssemblyResolver(resolvers.ToArray()); } } - public static IAssemblyResolver CreateExternalAssemblyResolver(BuildTarget target) - { - var externalDirs = HybridCLRSettings.Instance.externalHotUpdateAssembliyDirs; - if (externalDirs == null || externalDirs.Length == 0) - { - return new PathAssemblyResolver(); - } - else - { - var externalDirList = new List(); - foreach (var dir in externalDirs) - { - externalDirList.Add($"{dir}/{target}"); - externalDirList.Add(dir); - } - return new PathAssemblyResolver(externalDirList.ToArray()); - } - } - - public static IAssemblyResolver CreateBuildTargetAssemblyResolver(BuildTarget target) + public static IAssemblyResolver CreateAOTAssemblyResolver(BuildTarget target) { - return new CombinedAssemblyResolver(CreateHotUpdateAssemblyResolver(target), - new UnityPluginAssemblyResolver(), - new UnityDotNetAOTAssemblyResolver(), - new UnityEditorAssemblyResolver()); - } + return new PathAssemblyResolver(SettingsUtil.GetAssembliesPostIl2CppStripDir(target)); + } + + public static IAssemblyResolver CreateHotUpdateAndAOTAssemblyResolver(BuildTarget target, List hotUpdateDlls) + { + return new CombinedAssemblyResolver( + CreateHotUpdateAssemblyResolver(target, hotUpdateDlls), + CreateAOTAssemblyResolver(target) + ); + } } } diff --git a/Editor/Meta/PathAssemblyResolver.cs b/Editor/Meta/PathAssemblyResolver.cs index d36aefd..a356117 100644 --- a/Editor/Meta/PathAssemblyResolver.cs +++ b/Editor/Meta/PathAssemblyResolver.cs @@ -8,7 +8,7 @@ using UnityEngine; namespace HybridCLR.Editor.Meta { - public class PathAssemblyResolver : IAssemblyResolver + public class PathAssemblyResolver : AssemblyResolverBase { private readonly string[] _searchPaths; public PathAssemblyResolver(params string[] searchPaths) @@ -16,7 +16,7 @@ namespace HybridCLR.Editor.Meta _searchPaths = searchPaths; } - public string ResolveAssembly(string assemblyName, bool throwExIfNotFind) + protected override bool TryResolveAssembly(string assemblyName, out string assemblyPath) { foreach(var path in _searchPaths) { @@ -24,14 +24,12 @@ namespace HybridCLR.Editor.Meta if (File.Exists(assPath)) { Debug.Log($"resolve {assemblyName} at {assPath}"); - return assPath; + assemblyPath = assPath; + return true; } } - if (throwExIfNotFind) - { - throw new Exception($"resolve assembly:{assemblyName} fail"); - } - return null; + assemblyPath = null; + return false; } } } diff --git a/Editor/Meta/UnityDotNetAOTAssemblyResolver.cs b/Editor/Meta/UnityDotNetAOTAssemblyResolver.cs deleted file mode 100644 index b8df2a6..0000000 --- a/Editor/Meta/UnityDotNetAOTAssemblyResolver.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using UnityEngine; - -namespace HybridCLR.Editor.Meta -{ - public class UnityDotNetAOTAssemblyResolver : IAssemblyResolver - { - public string ResolveAssembly(string assemblyName, bool throwExIfNotFind) - { - // -#if !UNITY_2021_1_OR_NEWER - var assemblyFile = $"{UnityEditor.EditorApplication.applicationContentsPath}/MonoBleedingEdge/lib/mono/unityaot/{assemblyName}.dll"; -#else -#if UNITY_STANDALONE_WIN - var assemblyFile = $"{UnityEditor.EditorApplication.applicationContentsPath}/MonoBleedingEdge/lib/mono/unityaot-win32/{assemblyName}.dll"; -#elif UNITY_STANDALONE_OSX || UNITY_IOS - var assemblyFile = $"{UnityEditor.EditorApplication.applicationContentsPath}/MonoBleedingEdge/lib/mono/unityaot-macos/{assemblyName}.dll"; -#elif UNITY_STANDALONE_LINUX || UNITY_ANDROID - var assemblyFile = $"{UnityEditor.EditorApplication.applicationContentsPath}/MonoBleedingEdge/lib/mono/unityaot-linux/{assemblyName}.dll"; -#else - var assemblyFile = $"{UnityEditor.EditorApplication.applicationContentsPath}/MonoBleedingEdge/lib/mono/unityaot-linux/{assemblyName}.dll"; -#endif -#endif - - if (File.Exists(assemblyFile)) - { - Debug.Log($"UnityAOTAssemblyResolver.ResolveAssembly:{assemblyFile}"); - return assemblyFile; - } - if (throwExIfNotFind) - { - throw new Exception($"resolve assembly:{assemblyName} fail"); - } - return null; - } - } -} diff --git a/Editor/Meta/UnityEditorAssemblyResolver.cs b/Editor/Meta/UnityEditorAssemblyResolver.cs deleted file mode 100644 index 7057249..0000000 --- a/Editor/Meta/UnityEditorAssemblyResolver.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; - -namespace HybridCLR.Editor.Meta -{ - public class UnityEditorAssemblyResolver : IAssemblyResolver - { - public string ResolveAssembly(string assemblyName, bool throwExIfNotFind) - { - var refAss = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName); - if (refAss != null) - { - return refAss.Location; - } - if (throwExIfNotFind) - { - throw new Exception($"resolve assembly:{assemblyName} fail"); - } - return null; - } - } -} diff --git a/Editor/Meta/UnityEditorAssemblyResolver.cs.meta b/Editor/Meta/UnityEditorAssemblyResolver.cs.meta deleted file mode 100644 index fc640e4..0000000 --- a/Editor/Meta/UnityEditorAssemblyResolver.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 78d06a3ad750c0b4b80b583188b02df3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Editor/Meta/UnityPluginAssemblyResolver.cs b/Editor/Meta/UnityPluginAssemblyResolver.cs deleted file mode 100644 index b7ac13a..0000000 --- a/Editor/Meta/UnityPluginAssemblyResolver.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using UnityEngine; - -namespace HybridCLR.Editor.Meta -{ - public class UnityPluginAssemblyResolver : IAssemblyResolver - { - private static readonly HashSet s_ignoreDirs = new HashSet - { - "Editor", - "StreamingAssets", - "Resources", - }; - - private bool IsPluginDll(string dllPath) - { - var fileOrDirs = new HashSet(dllPath.Split('\\', '/')); - return !fileOrDirs.Any(dir => dir.EndsWith("~")) && !fileOrDirs.Intersect(s_ignoreDirs).Any(); - } - - public string ResolveAssembly(string assemblyName, bool throwExIfNotFind) - { - foreach(var dll in Directory.GetFiles(UnityEngine.Application.dataPath, "*.dll", SearchOption.AllDirectories)) - { - if (Path.GetFileNameWithoutExtension(dll) == assemblyName && IsPluginDll(dll)) - { - Debug.Log($"UnityPluginAssemblyResolver.ResolveAssembly:{dll}"); - return dll; - } - } - if (throwExIfNotFind) - { - throw new Exception($"resolve assembly:{assemblyName} fail"); - } - return null; - } - } -} diff --git a/package.json b/package.json index 2ad77f6..448191d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.13", + "version": "1.1.14", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From 0e04a66c91b760ac664e82fe4c35ec03a9d9eba6 Mon Sep 17 00:00:00 2001 From: walon Date: Fri, 16 Dec 2022 11:03:03 +0800 Subject: [PATCH 18/19] =?UTF-8?q?[new]=20=E6=96=B0=E5=A2=9E=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E5=91=BD=E4=BB=A4=20`HybridCLR/Generate/AOTDlls`=20?= =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E7=94=9F=E6=88=90=E8=A3=81=E5=89=AA=E5=90=8E?= =?UTF-8?q?=E7=9A=84AOT=20dlls?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Commands/PrebuildCommand.cs | 8 +- Editor/Commands/StripAOTDllCommand.cs | 97 ++++++++++++++++++++++ Editor/Commands/StripAOTDllCommand.cs.meta | 11 +++ package.json | 2 +- 4 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 Editor/Commands/StripAOTDllCommand.cs create mode 100644 Editor/Commands/StripAOTDllCommand.cs.meta diff --git a/Editor/Commands/PrebuildCommand.cs b/Editor/Commands/PrebuildCommand.cs index 30bf910..89196c4 100644 --- a/Editor/Commands/PrebuildCommand.cs +++ b/Editor/Commands/PrebuildCommand.cs @@ -17,16 +17,18 @@ namespace HybridCLR.Editor.Commands { BuildTarget target = EditorUserBuildSettings.activeBuildTarget; CompileDllCommand.CompileDll(target); - Il2CppDefGeneratorCommand.GenerateIl2CppDef(); // 这几个生成依赖HotUpdateDlls LinkGeneratorCommand.GenerateLinkXml(target); - ReversePInvokeWrapperGeneratorCommand.GenerateReversePInvokeWrapper(target); - AOTReferenceGeneratorCommand.GenerateAOTGenericReference(target); + + // 生成裁剪后的aot dll + StripAOTDllCommand.GenerateStripedAOTDlls(target, EditorUserBuildSettings.selectedBuildTargetGroup); // 桥接函数生成依赖于AOT dll,必须保证已经build过,生成AOT dll MethodBridgeGeneratorCommand.GenerateMethodBridge(target); + ReversePInvokeWrapperGeneratorCommand.GenerateReversePInvokeWrapper(target); + AOTReferenceGeneratorCommand.GenerateAOTGenericReference(target); } } } diff --git a/Editor/Commands/StripAOTDllCommand.cs b/Editor/Commands/StripAOTDllCommand.cs new file mode 100644 index 0000000..da64394 --- /dev/null +++ b/Editor/Commands/StripAOTDllCommand.cs @@ -0,0 +1,97 @@ +using HybridCLR.Editor.Installer; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; + +namespace HybridCLR.Editor.Commands +{ + public static class StripAOTDllCommand + { + [MenuItem("HybridCLR/Generate/AOTDlls", priority = 105)] + public static void GenerateStripedAOTDlls() + { + GenerateStripedAOTDlls(EditorUserBuildSettings.activeBuildTarget, EditorUserBuildSettings.selectedBuildTargetGroup); + } + + private static string GetLocationPathName(string buildDir, BuildTarget target) + { + switch(target) + { + case BuildTarget.StandaloneWindows: + case BuildTarget.StandaloneWindows64: return $"{buildDir}/{target}"; + case BuildTarget.StandaloneOSX: return buildDir; + case BuildTarget.iOS: return buildDir; + case BuildTarget.Android: return buildDir; + case BuildTarget.StandaloneLinux64: return buildDir; + default: return buildDir; + } + } + + public static void GenerateStripedAOTDlls(BuildTarget target, BuildTargetGroup group) + { + string outputPath = $"{SettingsUtil.HybridCLRDataDir}/StrippedAOTDllsTempProj/{target}"; + BashUtil.RemoveDir(outputPath); + + var buildOptions = BuildOptions.BuildScriptsOnly; + + bool oldExportAndroidProj = EditorUserBuildSettings.exportAsGoogleAndroidProject; + bool oldCreateSolutionWin = UnityEditor.WindowsStandalone.UserBuildSettings.createSolution; + bool oldBuildScriptsOnly = EditorUserBuildSettings.buildScriptsOnly; + EditorUserBuildSettings.buildScriptsOnly = true; + + switch (target) + { + case BuildTarget.StandaloneWindows: + case BuildTarget.StandaloneWindows64: + { + UnityEditor.WindowsStandalone.UserBuildSettings.createSolution = true; + break; + } + case BuildTarget.Android: + { + EditorUserBuildSettings.exportAsGoogleAndroidProject = true; + break; + } + } + + BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions() + { + scenes = EditorBuildSettings.scenes.Where(s => s.enabled).Select(s => s.path).ToArray(), + locationPathName = GetLocationPathName(outputPath, target), + options = buildOptions, + target = target, + targetGroup = group, + }; + + var report = BuildPipeline.BuildPlayer(buildPlayerOptions); + + EditorUserBuildSettings.buildScriptsOnly = oldBuildScriptsOnly; + switch (target) + { + case BuildTarget.StandaloneWindows: + case BuildTarget.StandaloneWindows64: + { + UnityEditor.WindowsStandalone.UserBuildSettings.createSolution = oldCreateSolutionWin; + break; + } + case BuildTarget.Android: + { + EditorUserBuildSettings.exportAsGoogleAndroidProject = oldExportAndroidProj; + break; + } + } + + if (report.summary.result != UnityEditor.Build.Reporting.BuildResult.Succeeded) + { + Debug.LogError("GenerateStripedAOTDlls 失败"); + return; + } + Debug.Log($"GenerateStripedAOTDlls target:{target} group:{group} path:{outputPath}"); + } + } +} diff --git a/Editor/Commands/StripAOTDllCommand.cs.meta b/Editor/Commands/StripAOTDllCommand.cs.meta new file mode 100644 index 0000000..3979b80 --- /dev/null +++ b/Editor/Commands/StripAOTDllCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 21fb0a02f23185141a4a3df67fe61789 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package.json b/package.json index 448191d..990caff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.14", + "version": "1.1.15", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime", From 00cedc166f7ca58cfb9a9ad645bd4a0ffc9b8fc9 Mon Sep 17 00:00:00 2001 From: walon Date: Fri, 16 Dec 2022 11:23:37 +0800 Subject: [PATCH 19/19] =?UTF-8?q?[fix]=20=E4=BF=AE=E5=A4=8DmacOS=E4=B8=8B?= =?UTF-8?q?=E7=9A=84=E7=BC=96=E8=AF=91bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Commands/StripAOTDllCommand.cs | 32 ++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/Editor/Commands/StripAOTDllCommand.cs b/Editor/Commands/StripAOTDllCommand.cs index da64394..a6d99e4 100644 --- a/Editor/Commands/StripAOTDllCommand.cs +++ b/Editor/Commands/StripAOTDllCommand.cs @@ -40,7 +40,11 @@ namespace HybridCLR.Editor.Commands var buildOptions = BuildOptions.BuildScriptsOnly; bool oldExportAndroidProj = EditorUserBuildSettings.exportAsGoogleAndroidProject; - bool oldCreateSolutionWin = UnityEditor.WindowsStandalone.UserBuildSettings.createSolution; +#if UNITY_EDITOR_OSX + bool oldCreateSolution = UnityEditor.OSXStandalone.UserBuildSettings.createXcodeProject; +#elif UNITY_EDITOR_WIN + bool oldCreateSolution = UnityEditor.WindowsStandalone.UserBuildSettings.createSolution; +#endif bool oldBuildScriptsOnly = EditorUserBuildSettings.buildScriptsOnly; EditorUserBuildSettings.buildScriptsOnly = true; @@ -49,7 +53,16 @@ namespace HybridCLR.Editor.Commands case BuildTarget.StandaloneWindows: case BuildTarget.StandaloneWindows64: { +#if UNITY_EDITOR_WIN UnityEditor.WindowsStandalone.UserBuildSettings.createSolution = true; +#endif + break; + } + case BuildTarget.StandaloneOSX: + { +#if UNITY_EDITOR_OSX + UnityEditor.OSXStandalone.UserBuildSettings.createXcodeProject = true; +#endif break; } case BuildTarget.Android: @@ -75,10 +88,19 @@ namespace HybridCLR.Editor.Commands { case BuildTarget.StandaloneWindows: case BuildTarget.StandaloneWindows64: - { - UnityEditor.WindowsStandalone.UserBuildSettings.createSolution = oldCreateSolutionWin; - break; - } + { +#if UNITY_EDITOR_WIN + UnityEditor.WindowsStandalone.UserBuildSettings.createSolution = oldCreateSolution; +#endif + break; + } + case BuildTarget.StandaloneOSX: + { +#if UNITY_EDITOR_OSX + UnityEditor.OSXStandalone.UserBuildSettings.createXcodeProject = oldCreateSolution; +#endif + break; + } case BuildTarget.Android: { EditorUserBuildSettings.exportAsGoogleAndroidProject = oldExportAndroidProj;