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

使用Reflection.Emit在运行时构建程序集时,我想在保存到光盘之前validation程序集MSIL。 像PEVerify一样,但在运行时。 有这样的API吗?

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

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

编辑:轶事证据:

  • 在编译器步骤中, Boo实际上调用了peverify.exe 。
  • Nemerle在测试中调用了peverify.exe 。
  • Castle.DynamicProxy在其测试中调用peverify.exe 。

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

该文章的摘要是:

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

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

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

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

也许它可以帮到你。

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

我最近发现我可以链接到Microsoft.Build.Tasks程序集,然后创建一个Microsoft.Build.Tasks.GetFrameworkSdkPath实例并调用Path属性 。 我注意到的一个奇怪的行为是第一次访问路径抛出exception,但如果你只是吞下该exception,那么你可以从那时开始访问路径。

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