{"record":{"id":"d5c91028cd56628d","repo":"egametang/ET","slug":"no-aot-assembly-found-please-run-hybridclr-gener-d5c910","errorCode":null,"errorMessage":"no aot assembly found. please run `HybridCLR/Generate/All` or `HybridCLR/Generate/AotDlls` to generate aot dlls before runing `HybridCLR/Generate/MethodBridge`","messagePattern":"no aot assembly found\\. please run `HybridCLR/Generate/All` or `HybridCLR/Generate/AotDlls` to generate aot dlls before runing `HybridCLR/Generate/MethodBridge`","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"Packages/cn.etetet.hybridclr/Scripts/Editor/Share/Commands/MethodBridgeGeneratorCommand.cs","lineNumber":65,"sourceCode":"            Debug.LogFormat(\"[MethodBridgeGeneratorCommand] output:{0}\", outputFile);\n        }\n\n        [MenuItem(\"HybridCLR/Generate/MethodBridgeAndReversePInvokeWrapper\", priority = 101)]\n        public static void GenerateMethodBridgeAndReversePInvokeWrapper()\n        {\n            BuildTarget target = EditorUserBuildSettings.activeBuildTarget;\n            GenerateMethodBridgeAndReversePInvokeWrapper(target);\n        }\n\n        public static void GenerateMethodBridgeAndReversePInvokeWrapper(BuildTarget target)\n        {\n            string aotDllDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(target);\n            List<string> aotAssemblyNames = Directory.Exists(aotDllDir) ?\n                Directory.GetFiles(aotDllDir, \"*.dll\", SearchOption.TopDirectoryOnly).Select(Path.GetFileNameWithoutExtension).ToList()\n                : new List<string>();\n            if (aotAssemblyNames.Count == 0)\n            {\n                throw new Exception($\"no aot assembly found. please run `HybridCLR/Generate/All` or `HybridCLR/Generate/AotDlls` to generate aot dlls before runing `HybridCLR/Generate/MethodBridge`\");\n            }\n            AssemblyReferenceDeepCollector collector = new AssemblyReferenceDeepCollector(MetaUtil.CreateAOTAssemblyResolver(target), aotAssemblyNames);\n\n            var methodBridgeAnalyzer = new Analyzer(new Analyzer.Options\n            {\n                MaxIterationCount = Math.Min(20, SettingsUtil.HybridCLRSettings.maxMethodBridgeGenericIteration),\n                Collector = collector,\n            });\n\n            methodBridgeAnalyzer.Run();\n\n            List<string> hotUpdateDlls = SettingsUtil.HotUpdateAssemblyNamesExcludePreserved;\n            var cache = new AssemblyCache(MetaUtil.CreateHotUpdateAndAOTAssemblyResolver(target, hotUpdateDlls));\n\n            var reversePInvokeAnalyzer = new MonoPInvokeCallbackAnalyzer(cache, hotUpdateDlls);\n            reversePInvokeAnalyzer.Run();\n\n            var calliAnalyzer = new CalliAnalyzer(cache, hotUpdateDlls);","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/egametang/ET/blob/5cab01f7a8bee5f49f4781eebe9e2b1c6d7ebe0f/Packages/cn.etetet.hybridclr/Scripts/Editor/Share/Commands/MethodBridgeGeneratorCommand.cs#L47-L83","documentation":"Thrown by MethodBridgeGeneratorCommand.GenerateMethodBridgeAndReversePInvokeWrapper when the post-IL2CPP-strip AOT directory contains no DLLs. The method bridge generator must walk AOT assembly metadata to compute the bridging/signature-sharing tables; it cannot proceed without trimmed AOT assemblies.","triggerScenarios":"Invoking HybridCLR/Generate/MethodBridge (or Generate/All) when the strip output directory for the active BuildTarget is missing or empty -- identical precondition to error 181 but reached during the method-bridge phase.","commonSituations":"CI pipeline that runs only MethodBridge generation without the prior strip step; a stale HybridCLRData folder after a Unity version upgrade; build target changed between strip and bridge generation.","solutions":["Run HybridCLR/Generate/All to run the full pipeline (compile DLL, generate link.xml, strip AOT, then bridge) in the correct order.","If running steps individually, always run HybridCLR/Generate/AotDlls before HybridCLR/Generate/MethodBridge.","Ensure the active build target is set before generation, since the strip output is keyed by target."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"string aotDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(EditorUserBuildSettings.activeBuildTarget);\nif (!Directory.Exists(aotDir) || Directory.GetFiles(aotDir, \"*.dll\").Length == 0)\n    throw new InvalidOperationException(\"Run HybridCLR/Generate/AotDlls before MethodBridge.\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Run generation steps in dependency order: CompileDll, LinkXml, AotDlls, AOTGenericReference, MethodBridge.","Use HybridCLR/Generate/All in automation to guarantee correct ordering.","Tag the strip output with build target + Unity version to detect stale caches."],"tags":["hybridclr","method-bridge","aot","code-generation"],"backgroundTag":null,"analyzedSha":"5cab01f7a8bee5f49f4781eebe9e2b1c6d7ebe0f","analyzedAt":"2026-08-13T21:10:40.377Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}