是否有用于在运行时验证动态程序集的MSIL的API?

时间:2011-09-03 03:04:12

标签: c# .net f# cil peverify

在运行时使用Reflection.Emit构建程序集时,我想在保存到光盘之前验证程序集MSIL。与PEVerify类似,但在运行时。有没有这样的API?

4 个答案:

答案 0 :(得分:8)

似乎peverify.exe是c:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ peverify.dll(或c:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \)的前端peverify.dll for CLR 2.0),这是一个 native DLL(实际上,peverify.exe也是原生的)

我没有在任何地方看到这个记录,因此它可能不是公共API。您可以使用Dependency Walker之类的东西从该DLL中找出导出的函数,但我认为只调用peverify.exe会更简单。

编辑:轶事证据:

答案 1 :(得分:2)

您可以将ILSpy的反编译器用于进程内解决方案,而不是使用PEVerify,如下所述:http://www.codeproject.com/Tips/659692/Automated-MSIL-PE-verification-using-ILSpy

该文章的摘要是:

  1. 收集相关的DLL以引用您的测试项目,或 在这种情况下运行时IL检查器
  2. 使用Mono.Cecil
  3. 迭代验证方法
  4. 对于每种方法,将其添加到执行验证的ICSharpCode.Decompiler中定义的AstBuilder。例如。
  5. var context = new DecompilerContext(method.Module) { CurrentType = method.DeclaringType };
    var astBuilder = new AstBuilder(context);
    astBuilder.AddMethod(method);
    

    性能方面我没有检查哪种方法更快。虽然这个方法在进程中可能会慢一些,因为在验证IL时会构建抽象语法树(我必须设置一个性能测试来检查这个理论)。

    我发现ILSpy反编译器比PEVerify更可靠,如上文所述,在一个实例中,PEVerify声明一个程序集有效,而ILSpy正确地给出了一个漂亮的堆栈跟踪,表明我的生成错误。

答案 2 :(得分:0)

Debugging LCG允许您使用Windbg在运行时调试生成的代码。

也许它可以帮到你。

答案 3 :(得分:0)

调用peverify确实可能是最好的方法,但peverify位于许多不同的目录中,具体取决于.NET的运行版本。您可以尝试枚举所有这些路径并检查最新路径,但这在最后一次计算IIRC时至少有6条不同的路径,并且不是跨平台的,即。不包括Mono。

我最近发现我可以链接到Microsoft.Build.Tasks程序集,然后create an instance of Microsoft.Build.Tasks.GetFrameworkSdkPath and call the Path property。我注意到的一个奇怪的行为是第一次访问路径引发异常,但如果你只是吞下该异常,那么你可以从那时开始访问路径。

Peverify.exe然后是Path.Combine(新的GetFrameworkSdkPath()。路径,“bin \ peverify”)。