我正在为一个相当大的MonoTouch应用程序构建系统,该应用程序使用了许多跨平台组件。因此,我们经常遇到这样一种情况:其中一个跨平台组件做了一些无法编译的东西。如果实际执行某些操作,设备构建将崩溃。此时,我们必须追踪崩溃发生的位置,找到有问题的方法,并将其破解,以便它不会尝试在MonoTouch构建中进行JIT。
我的问题是,有没有办法在构建过程中检测这些东西?起初,我们有一个试图检测通用虚方法的正则表达式,但是某些类型的LINQ和lambdas也会出现问题,它们也会尝试JIT,而我宁愿不尝试编写自己的解析器来检测它们所有。我已经尝试过使用monodis AssemblyName.dll
了,它会给我很多遗漏的方法错误,但是大部分看起来都是无害的 - 即使它们不是,它也没有告诉我在哪里引用所述方法是这样我可以看到需要做什么。最重要的是,有时它会在程序集结束前与Abort trap: 6
或Bus error: 10
一起崩溃,这是非常无益的。有没有更好的方法可以在构建过程中检测到JIT的尝试?
答案 0 :(得分:1)
我的问题是,有没有办法在构建过程中检测这些东西?
没有。使用JIT(或更准确地说,它试图使用JIT的例外)是在本机可执行文件中找不到某些内容时的运行时回退。
使用您自己的工具(甚至可能是Gendarme规则)检测(某些/大多数)导致异常的条件并非不可能(也不容易)。但是,这是一个移动目标,因为我们正在修复reported问题,因此您必须使用每个新版本更新您的工具(或冒险花时间修复不再是问题了。)
真正有用的(使用或不使用自己的工具)是报告此类问题,以便跟踪它们并成为Xamarin测试套件的一部分。
我尝试过使用monodis AssemblyName.dll
monodis
需要访问所有程序集引用,否则它将无法工作(并且可能崩溃)。
答案 1 :(得分:0)
在“检测”部分:当你弄清楚什么结构导致问题时,创建检测它的FxCop自定义规则并在普通程序集上运行它。这样您就不需要编写自己的解析器了。
链接:FxCop - http://msdn.microsoft.com/en-us/library/bb429476%28v=VS.80%29.aspx FxCop操作方法的自定义规则:http://www.codeproject.com/Articles/30666/7-Steps-to-Write-Your-Own-Custom-Rule-using-FXCOP