短篇故事
我正在使用以下 Mono.Cecil 代码从接口和实现该接口的类中删除除几个方法之外的所有方法。
static void Main(string[] args)
{
var moduleDef = ModuleDefinition.ReadModule("SomeService.dll");
var bigService = moduleDef.Types.Single(t => t.Name == "BigService"); // interface
var bigServiceClient = moduleDef.Types.Single(t => t.Name == "BigServiceClient"); // class implementing above interface
var toSave = new[] {"method1", "method2"};
SaveMethods(bigService, toSave);
SaveMethods(bigServiceClient, toSave);
moduleDef.Write(@"C:\AutobooksCode\MAIN\API\JHA\JHA.SymXchange.V2\bin\Release\JHA.SymXchange.V2_updated.dll");
}
private static void SaveMethods(TypeDefinition typeDef, string[] names)
{
var methodsToSave = typeDef.Methods.Where(m => names.Contains(m.Name, StringComparer.OrdinalIgnoreCase)).ToList();
var ctors = typeDef.Methods.Where(m => m.Name == ".ctor");
methodsToSave.AddRange(ctors);
// remove all methods except the ones I want to save
var pos = 0;
while (true)
{
if (typeDef.Methods.Count == methodsToSave.Count)
break;
if (methodsToSave.Contains(typeDef.Methods[pos]))
pos++;
else
{
typeDef.Methods.RemoveAt(pos);
}
}
}
代码有效,ILDASM 和 JustDecompile 看起来一切都很好,最重要的是,DLL 可以很好地与客户端一起工作。但是,通过 PEVerify 运行它会Type load failed.
为[token 0x02001C35]
.
我曾经ILDASM /TOK
看到哪个令牌是 0x02001C35,它是我正在修改的类 ( BigServiceClient
)。我只是看不出问题是什么。
有关如何进一步调查 PEVerify 错误的任何指针/想法/提示?
很长的故事
我正在使用旧版 SOAP 接口。我svcutil
用来生成代理,但由于这个接口的遗留特性,这些代理非常庞大——就像单个类中有 1500 多个方法一样。这导致了对象创建以及 Castle DynamicProxy 代理的一些性能问题。
作为快速测试,我从生成的 .cs 代理文件中删除了我需要的所有方法(是的,1500+ 中只有 2 个),重新编译并获得了更好的结果。时间从 6-7 秒缩短到 20 毫秒以下。
编辑这些文件以手动删除它很乏味,所以我想我会用 Mono.Cecil 自动化它。如上所述,一切正常,但我担心 peverify 错误。
我知道你可以用 IL weaving 做一些非常复杂和疯狂的事情,但我只需要删除一堆未使用的方法。是的,我可以手动解析生成的源代码并将其从那里删除,但如果您曾经见过从 生成的 SOAP 代理svcutil
,那么这是我想避免的路径。