Rimworld Mod制作教程6 使用Harmony对C#代码Patch

废话

如果你看了前几篇文章,应该对XML PatchOperations有印象,它使用xpath的语法对xml文件进行patch操作。而Harmony的作用与之相似,是对C#代码进行patch操作。
Harmony是一个运行库,专门为解决mod冲突之类的问题,不仅用于rimworld,还有很多著名的社区都以Harmony为基础创造了很多mod。
Harmony的原理是利用反射获取对应类中的方法,然后加上特性标签进行逻辑控制,达到不破坏原有代码进行更新的效果。

核心内容

1.使用Harmony对C#代码Patch

1.1 环境建立

很多人还在使用旧方法,每个人都复制了一份Harmony库到自己的代码里,这样无形增加了储存空间和加载速度。我只讲目前最新的Harmony使用姿势。
按照教程1的步骤建一个C#运行库。然后下载最新的Harmony库文件。可以在创意工坊搜索到,然后引用0Harmony.dll。顺带一提,最新的0Harmony.dll是以framework4.7.2为基础的工程,如果framework版本不够还需要更新一下版本。

1.2 创建管理器实例

using Verse;
using HarmonyLib;
using System.Reflection;
namespace SR.NDQ.Patch
{
    [StaticConstructorOnStartup]
    public class PatchMain
    {
        public static Harmony instance;
        static PatchMain()
        {
            instance = new Harmony("SR.NoDecreeQuest");
            instance.PatchAll(Assembly.GetExecutingAssembly());//对所有特性标签的方法进行patch
        }
    }
}

1.3 编写对应Patch方法

[HarmonyPatch]
标签需要填写改写的类和方法名字以及参数类型,至于type参数类型可以不填,只有一种情况不填会报错,就是这个方法有其他重载方法,不填type无法确定是哪个同名方法。

[HarmonyPrefix]
标签表示下面的方法在原函数之前执行,这里的bool返回不是原函数的返回值。
true表示原函数继续执行,false表示原函数被替代,不会继续执行

[HarmonyPatch(typeof(QuestUtility), "SendLetterQuestAvailable", new Type[] { typeof(Quest) })]
class QuestUtility_Patch2
{
    [HarmonyPrefix]
    static bool Prefix(Quest quest)
    {
        NDQMain.instance.SRLog("SendLetterQuestAvailable");
        if (!NDQMain.instance.modSetting.isOpenMod)
        {
            return true;
        }
        return quest != null;
    }
}

[HarmonyPatch]标签可以拆分写,像下面注释的那种写法。
如果原函数不是void返回值,那么ref XXX __result表示的就是原来的返回值,而bool就是是否取代原方法。

//[HarmonyPatch(typeof(QuestUtility))]
//[HarmonyPatch("GenerateQuestAndMakeAvailable")]
//[HarmonyPatch(new Type[] {typeof(QuestScriptDef),typeof(Slate)})]
[HarmonyPatch(typeof(QuestUtility), "GenerateQuestAndMakeAvailable", new Type[] { typeof(QuestScriptDef), typeof(Slate) })]
class QuestUtility_Patch1
{
    [HarmonyPrefix]
    static bool Prefix(ref Quest __result, QuestScriptDef root, Slate vars)
    {
        NDQMain.instance.SRLog("GenerateQuestAndMakeAvailable");
        if (!NDQMain.instance.modSetting.isOpenMod)
        {
            return true;
        }
        bool isDecreeQuest = false;
        if (root.decreeTags != null)
        {
            foreach (var s in root.decreeTags)
            {
                if (s.Equals("All"))
                {
                    isDecreeQuest = true;
                }
            }
        }
        if (!isDecreeQuest)
        {
            Quest quest = QuestGen.Generate(root, vars);
            Find.QuestManager.Add(quest);
            __result = quest;
        }
        else
        {
            __result = null;
            NDQMain.instance.SRLog("法令任务已拦截");
        }
        return false;//false将不执行原方法
    }
}

1.4 示例

这份代码的内容是拦截原版法令任务生成。可以参考一下工程结构。源码

https://github.com/pardeike/Harmony/wiki上有更详细的使用方法,本篇只介绍了简单通用的部分。

如果这篇文章对你有帮助,点赞收藏支持一下呗!

<think>好的,我现在需要帮助用户找到CUDA 12.5兼容的PyTorch版本。首先,我得确认CUDA 12.5是否已经发布,因为根据我之前的知识,最新的稳定版本可能是CUDA 12.4,而CUDA 12.5可能还在测试阶段或者用户可能误写了版本号。不过,用户明确提到了CUDA 12.5,所以我需要先核实这一点。 接下来,我应该检查PyTorch官方文档或支持的CUDA版本列表,看看他们是否已经支持CUDA 12.5。通常,PyTorch版本特定CUDA版本对应,比如PyTorch 2.0可能支持CUDA 11.7和11.8,而PyTorch 2.1可能支持CUDA 12.1。如果CUDA 12.5确实存在,可能需要PyTorch的最新nightly版本或尚未发布的稳定版本来支持。 如果发现CUDA 12.5尚未被官方支持,我需要建议用户使用较新的PyTorch版本,或者考虑降级CUDA到兼容的版本,比如12.1。同时,用户提供的引用中提到了conda安装命令,例如`conda install pytorch=*=*cuda*`,这可能是指安装支持CUDAPyTorch版本,但需要指定正确的版本号。 另外,用户遇到了安装依赖时的SOCKS支持错误,这可能网络配置有关,但当前问题主要关于CUDA兼容性,这部分可能需要单独处理,但可以提醒用户注意环境配置。 总结步骤: 1. 确认CUDA 12.5是否存在。 2. 查找PyTorch官方支持的CUDA版本。 3. 提供兼容的PyTorch版本安装命令。 4. 建议替代方案,如使用不同CUDA版本。 5. 提醒用户检查驱动和环境配置。</think>关于CUDA 12.5兼容的PyTorch版本,以下是分步解答: 1. **当前CUDA 12.5的兼容性状态** - 截至2024年7月,NVIDIA官方尚未发布CUDA 12.5的稳定版本[^1]。PyTorch官方文档显示最新支持的CUDA版本为12.1(对应PyTorch 2.1+) 2. **推荐解决方案** - 若需使用PyTorchCUDA 12.x系列,建议选择以下组合: ```bash # 安装支持CUDA 12.1的PyTorch 2.1+ conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia ``` 3. **替代方案** - 若必须使用CUDA 12.5,可尝试以下方法: ```bash # 安装最新的PyTorch nightly版本(可能包含实验性支持) conda install pytorch torchvision torchaudio pytorch-cuda=12.5 -c pytorch-nightly -c nvidia ``` 4. **验证安装** ```python import torch print(torch.__version__) # 应显示2.2.0+ print(torch.cuda.is_available()) # 应返回True ``` 5. **注意事项** - 需要确保NVIDIA驱动版本≥535.86.10(通过`nvidia-smi`命令查看) - 若遇到类似[^2]的依赖错误,建议先配置清华镜像源: ```bash pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值