我玩的游戏有很多模组。这些 mod 以资源(图像、配置文件)以及用于添加或修改原始游戏的 C# 代码的 .dll 的形式出现。问题是没有机制可以防止模组之间发生冲突。 错误示例
Mod 可以在 Steam 创意工坊上找到,但如果您想查看示例,也可以在 Github 上找到一些模组,例如 CommonSense。 Dll 位于 1.x/Assemblies 部分。
我想创建一个软件来扫描mod文件以检查潜在的冲突,特别是读取.dll文件以确保相同的方法不会被多个mod修改。
到目前为止,我还不知道如何“轻松地”读取dll文件的内容。
您有读取 dll 文件或提取其方法的代码示例吗?
MetadataLoadContext
从 mod dll (HarmonyPatch
) 读取所有 CommonSense.dll
属性,并打印出第一个(类型)和第二个(方法名称)参数。这可以帮助您了解哪些方法已被修补。
var paths = new List<string>(Directory.GetFiles(@"E:\rimworldmod", "*.dll"));
var resolver = new PathAssemblyResolver(paths);
var mlc = new MetadataLoadContext(resolver);
var asm = mlc.LoadFromAssemblyPath(@"E:\rimworldmod\CommonSense.dll");
foreach(var t in asm.DefinedTypes)
{
foreach (var cad in t.CustomAttributes)
{
if (cad.AttributeType.FullName == "HarmonyLib.HarmonyPatch")
{
var aargs = cad.ConstructorArguments;
if (aargs.Count > 1)
Console.WriteLine($"\t{aargs[0]} {aargs[1]}");
}
}
}
一些注意事项:
我把所有相关的DLL(
HarmonyMod
和包中的dllkrafs.rimworld.ref
)放在E:\rimworldmod
目录下。
一些补丁,例如
JobDriver_Goto_MoveNext_CommonSensePatch
,它使用transpiler。方法名是在方法体中声明的,这种情况需要分析IL代码。