Tencent / InjectFix

InjectFix is a hot-fix solution library for Unity
Other
1.97k stars 418 forks source link

使用了BurstCompile的类和结构体不能进行注入,否则加载patch之后会报burst的错误 #96

Open King098 opened 4 years ago

King098 commented 4 years ago

Unity (0,0): Burst error BC1016: The managed function IFix.WrappersManagerImpl.GetPatch(int id) is not supported

HahnSC commented 3 years ago

+1

chexiongsheng commented 3 years ago

额。。xx is not supported,不是应该找Unity去supported一下么?

thuris001 commented 3 years ago

我这的版本 2019.4.X Burst 1.4.8 版本 有burstCompile 的类或结构体在config 配置中时, 在IOS Xcode导出的时 执行注入就失败了

yasee commented 2 years ago

当我用Unity2020.3.23.f1,包括InjectFix和以下组件进行iOS构建(Build Settings->iOS Build)时,我得到了一个错误。 有什么变通办法吗?

Component

namespace Examples
{
    public class Test : MonoBehaviour
    {
        [BurstCompile(CompileSynchronously = true)]
        private struct MyJob : IJob
        {
            public void Execute()
            {
            }
        }
    }

Build Error

(0,0): Burst error BC1016: The managed function `IFix.WrappersManagerImpl.GetPatch(int id)` is not supported
 at Examples.Test.MyJob.Execute(Examples.Test.MyJob* this)
 at Unity.Jobs.IJobExtensions.JobStruct`1<Examples.Test.MyJob>.Execute(ref Examples.Test.MyJob data, System.IntPtr additionalPtr, System.IntPtr bufferRangePatchData, ref Unity.Jobs.LowLevel.Unsafe.JobRanges ranges, int jobIndex) (at /Users/bokken/buildslave/unity/build/Runtime/Jobs/Managed/IJob.cs:30)
BuildFailedException: Burst compiler (1.4.7) failed running
yasee commented 2 years ago

Burst编译器在OnPostBuildPlayerScriptDLLs中运行,但 InjectFix的IFixEditor.AutoInjectAssemblys首先被执行,并改变了程序集的内容,导致错误。

(0,0): Burst error BC1016: The managed function `IFix.WrappersManagerImpl.GetPatch(int id)` is not supported

 at Test.InverseX(UnityEngine.Quaternion rotation)
 at TestJob.ProcessAnimation(TestJob* this, UnityEngine.Animations.AnimationStream* stream)
 at UnityEngine.Animations.ProcessAnimationJobStruct`1<TestJob>.Execute(ref TestJob data, System.IntPtr animationStreamPtr, System.IntPtr methodIndex, ref Unity.Jobs.LowLevel.Unsafe.JobRanges ranges, int jobIndex) (at /Users/bokken/buildslave/unity/build/Modules/Animation/Managed/ProcessAnimationJobStruct.cs:49)

  at Unity.Burst.Editor.BurstAotCompiler+BclRunner.RunProgram (UnityEditor.Utils.Program p, System.String exe, System.String args, System.String workingDirectory, UnityEditor.Scripting.Compilers.CompilerOutputParserBase parser) [0x001bf] in /Users/aaa/app/Library/PackageCache/com.unity.burst@1.4.7/Editor/BurstAotCompiler.cs:1011
  at Unity.Burst.Editor.BurstAotCompiler+BclRunner.RunManagedProgram (System.String exe, System.String args, System.String workingDirectory, UnityEditor.Scripting.Compilers.CompilerOutputParserBase parser) [0x0003f] in /Users/aaa/app/Library/PackageCache/com.unity.burst@1.4.7/Editor/BurstAotCompiler.cs:928
  at Unity.Burst.Editor.BurstAotCompiler+BclRunner.RunManagedProgram (System.String exe, System.String args, UnityEditor.Scripting.Compilers.CompilerOutputParserBase parser) [0x00000] in /Users/aaa/app/Library/PackageCache/com.unity.burst@1.4.7/Editor/BurstAotCompiler.cs:903
  at Unity.Burst.Editor.BurstAotCompiler.OnPostBuildPlayerScriptDLLsImpl (UnityEditor.Build.Reporting.BuildReport report) [0x007b6] in /Users/aaa/app/Library/PackageCache/com.unity.burst@1.4.7/Editor/BurstAotCompiler.cs:444
  at Unity.Burst.Editor.BurstAotCompiler.OnPostBuildPlayerScriptDLLs (UnityEditor.Build.Reporting.BuildReport report) [0x0000c] in /Users/aaa/app/Library/PackageCache/com.unity.burst@1.4.7/Editor/BurstAotCompiler.cs:164
  at UnityEditor.Build.BuildPipelineInterfaces.OnPostBuildPlayerScriptDLLs (UnityEditor.Build.Reporting.BuildReport report) [0x00033] in /Users/bokken/buildslave/unity/build/Editor/Mono/BuildPipeline/BuildPipelineInterfaces.cs:516
yasee commented 2 years ago

当我有-enableInjectFix参数时,我禁用了BurstCompiler,并将IFixEditor.AutoInject设置为true。

public class IFixInitializer
{
    [InitializeOnLoadMethod]
    static void Initialize()
    {
        var arguments = Environment.GetCommandLineArgs();
        if (Array.IndexOf(arguments, "-enableInjectFix") != -1)
        {
            IFixEditor.AutoInject = true;
            DisableBurstCompiler();
        }
        else
        {
            IFixEditor.AutoInject = false;
        }
    }

    static void DisableBurstCompiler()
    {
        var burstPlatformAotSettings = Type.GetType("Unity.Burst.Editor.BurstPlatformAotSettings,Unity.Burst.Editor");
        if (burstPlatformAotSettings == null) return;
        var getOrCreateSettings = burstPlatformAotSettings.GetMethod("GetOrCreateSettings", BindingFlags.NonPublic | BindingFlags.Static);
        var enableBurstCompilation = burstPlatformAotSettings.GetField("EnableBurstCompilation", BindingFlags.NonPublic | BindingFlags.Instance);
        var save = burstPlatformAotSettings.GetMethod("Save", BindingFlags.NonPublic | BindingFlags.Instance);
        var aotSettingObj = getOrCreateSettings.Invoke(null, new object[] {EditorUserBuildSettings.activeBuildTarget});
        enableBurstCompilation.SetValue(aotSettingObj, false);
        save.Invoke(aotSettingObj, new object[] {EditorUserBuildSettings.activeBuildTarget});
    }
}
AnyueKami commented 9 months ago

当我用Unity2020.3.23.f1,包括InjectFix和以下组件进行iOS构建(Build Settings->iOS Build)时,我得到了一个错误。 有什么变通办法吗?

Component

namespace Examples
{
    public class Test : MonoBehaviour
    {
        [BurstCompile(CompileSynchronously = true)]
        private struct MyJob : IJob
        {
            public void Execute()
            {
            }
        }
    }

Build Error

(0,0): Burst error BC1016: The managed function `IFix.WrappersManagerImpl.GetPatch(int id)` is not supported
 at Examples.Test.MyJob.Execute(Examples.Test.MyJob* this)
 at Unity.Jobs.IJobExtensions.JobStruct`1<Examples.Test.MyJob>.Execute(ref Examples.Test.MyJob data, System.IntPtr additionalPtr, System.IntPtr bufferRangePatchData, ref Unity.Jobs.LowLevel.Unsafe.JobRanges ranges, int jobIndex) (at /Users/bokken/buildslave/unity/build/Runtime/Jobs/Managed/IJob.cs:30)
BuildFailedException: Burst compiler (1.4.7) failed running

你这个改了么

AnyueKami commented 9 months ago

Unity (0,0): Burst error BC1016: The managed function IFix.WrappersManagerImpl.GetPatch(int id) is not supported

你好,当时这个问题是怎么解决的,我也遇到了同样的问题。