如何在Godot构建中使用Mono.Cecil编织C#脚本?
在Godot中实现Mono.Cecil编织Core代码的方案
针对你的场景(拆分game、core、core-test包,构建时编织core的C#代码),可以通过以下几种方式实现,替代Unity的CompilationPipeline.assemblyCompilationFinished回调:
方案一:使用MSBuild Targets(推荐,与编译流程深度集成)
Godot的C#项目编译基于MSBuild,因此可以直接在core项目的.csproj文件中添加自定义Target,绑定到编译完成后的阶段,自动触发编织逻辑。
- 在
core.csproj中添加以下配置:
<Target Name="WeaveCoreAssembly" AfterTargets="Build"> <!-- 调用独立的编织工具项目,传入编译后的core程序集路径 --> <Exec Command="dotnet run --project $(SolutionDir)CoreWeaver\CoreWeaver.csproj -- $(TargetPath)" /> </Target>
- 创建
CoreWeaver控制台项目,编写Mono.Cecil的编织逻辑:
using Mono.Cecil; using System; namespace CoreWeaver { class Program { static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("请传入core程序集路径"); return; } var assemblyPath = args[0]; var assembly = AssemblyDefinition.ReadAssembly(assemblyPath); // 在这里执行你的编织操作,比如修改IL、注入代码等 // ... assembly.Write(assemblyPath); Console.WriteLine($"已完成对 {assemblyPath} 的编织"); } } }
- 确保game项目引用core项目后,每次core编译完成都会自动触发编织,完全同步编译流程。
方案二:利用Godot编辑器的编译回调
如果需要在编辑器中实时编织(比如修改core代码后立即生效),可以通过EditorServer的assemblyCompiled信号实现类似Unity的回调效果:
- 创建Editor插件脚本(放在game项目的
addons/weaver目录下):
using Godot; using Mono.Cecil; using System; [Tool] public class WeaverPlugin : EditorPlugin { public override void _EnterTree() { // 注册编译完成信号 EditorServer.AssemblyCompiled += OnAssemblyCompiled; } public override void _ExitTree() { // 移除信号监听,避免内存泄漏 EditorServer.AssemblyCompiled -= OnAssemblyCompiled; } private void OnAssemblyCompiled(string assemblyPath) { // 仅处理core程序集 if (assemblyPath.EndsWith("core.dll", StringComparison.OrdinalIgnoreCase)) { WeaveAssembly(assemblyPath); } } private void WeaveAssembly(string path) { try { var assembly = AssemblyDefinition.ReadAssembly(path); // 执行编织逻辑 // ... assembly.Write(path); GD.Print($"已编织core程序集:{path}"); } catch (Exception e) { GD.PushError($"编织core程序集失败:{e.Message}"); } } }
- 在Godot编辑器的
项目设置 > 插件中启用该插件,此后每次编辑器编译core程序集时都会自动触发编织。
方案三:手动编织(适合CI/CD或手动构建流程)
如果是批量构建或CI环境,可以通过命令行手动触发编译和编织,再构建game项目:
# 编译core项目 dotnet build ./core/core.csproj --configuration Release # 执行编织逻辑 dotnet run --project ./CoreWeaver/CoreWeaver.csproj -- ./core/bin/Release/net6.0/core.dll # 构建Godot游戏 godot --headless --export-release "Windows Desktop" ./build/game.exe
注意事项
- 确保Mono.Cecil版本与Godot使用的.NET版本兼容(Godot 4.x推荐使用.NET 6/7/8对应的Cecil版本)。
- 编织时注意程序集的文件锁定问题,编辑器环境下可尝试先复制程序集再编织,避免读写冲突。
- MSBuild Target方式更适合自动化构建,无需依赖编辑器插件,稳定性更高。
内容的提问来源于stack exchange,提问作者Sebastian Barth
相关产品推荐
相关产品推荐

