在Windows中运行良好的控制台应用程序在Mono运行时执行时会抛出System.InvalidProgramException。
该应用程序使用传统的第三方组件--Dundas Gauge for .NET - 来生成图像。
以下是例外情况:
System.InvalidProgramException: Invalid IL code in Dundas.Gauges.WebControl.GaugeCore:.ctor (Dundas.Gauges.WebControl.GaugeContainer): IL_0013: stfld 0x0400019c
at Dundas.Gauges.WebControl.GaugeContainer..ctor () [0x00000] in <filename unknown>:0
at GSR.Dashboard.Gauges.GrowthGaugeFactory.CreateGaugeContainer () [0x00000] in <filename unknown>:0
at GSR.Dashboard.GaugeCompiler.Program.Main (System.String[] Args) [0x00000] in <filename unknown>:0
显然,我们在第三方代码中遇到了问题 - 构造函数 - 我无法控制它。
其他详情:
这是使用Visual Studio 2008编译的.NET 3.5应用程序。
我试图在Windows上使用多个版本的Mono(Mono 5.2.0.224 x64,Mono 3.12.1 x32)和FreeBSD(Mono 4.8.1 amd64)来运行它。
所有这些运行时都会发生同样的异常。
第三方组件是32位版本。
使用ILDasm检查时,第三方组件似乎被混淆了。
可以采取哪些措施来解决此问题并让程序在Mono中运行?我觉得这种流行的组件包含无效的IL会有点疯狂。它怎么可能在微软的.NET运行时而不是Mono运行时?
答案 0 :(得分:0)
Mono只是一个基于Microsoft发布标准的开源MSIL运行时。因此,如果混淆的程序集(就像你遇到的那个)使用一些特定于.NET Framework的技巧(这很常见并且通常是混淆器昂贵且有效的原因),Mono将无法执行它,因为这违背了Mono的设计(在某些情况下,标准合规性比与.NET Framework的兼容性更重要)。
因此,在您的情况下,您只能返回.NET Framework和Windows。如果您阅读最终用户许可协议,那么第三方程序集的许可也是必需的。
顺便说一句,Dundas不仅受欢迎,而且后来被微软收购,成为了.NET Framework内置组件。单声道人试图克隆它,但他们太忙于其他事情,所以子项目没有完成,