You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,绑定到编译完成后的阶段,自动触发编织逻辑。

  1. 在core.csproj中添加以下配置:
<Target Name="WeaveCoreAssembly" AfterTargets="Build">
  <!-- 调用独立的编织工具项目,传入编译后的core程序集路径 -->
  <Exec Command="dotnet run --project $(SolutionDir)CoreWeaver\CoreWeaver.csproj -- $(TargetPath)" />
</Target>
  1. 创建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} 的编织");
        }
    }
}
  1. 确保game项目引用core项目后,每次core编译完成都会自动触发编织,完全同步编译流程。

方案二:利用Godot编辑器的编译回调

如果需要在编辑器中实时编织(比如修改core代码后立即生效),可以通过EditorServer的assemblyCompiled信号实现类似Unity的回调效果:

  1. 创建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}");
        }
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 18:05:21