使用C#检查dll内容

问题描述 投票:0回答:1

我玩的游戏有很多模组。这些 mod 以资源(图像、配置文件)以及用于添加或修改原始游戏的 C# 代码的 .dll 的形式出现。问题是没有机制可以防止模组之间发生冲突。 错误示例

Mod 可以在 Steam 创意工坊上找到,但如果您想查看示例,也可以在 Github 上找到一些模组,例如 CommonSense。 Dll 位于 1.x/Assemblies 部分。

我想创建一个软件来扫描mod文件以检查潜在的冲突,特别是读取.dll文件以确保相同的方法不会被多个mod修改。

到目前为止,我还不知道如何“轻松地”读取dll文件的内容。

您有读取 dll 文件或提取其方法的代码示例吗?

c# dll
1个回答
0
投票

以下代码使用

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
和包中的dll
krafs.rimworld.ref
)放在
E:\rimworldmod
目录下。

一些补丁,例如

JobDriver_Goto_MoveNext_CommonSensePatch
,它使用transpiler。方法名是在方法体中声明的,这种情况需要分析IL代码。

© www.soinside.com 2019 - 2024. All rights reserved.