System.InvalidProgramException:移动第三方.NET组件时无效的IL代码(Dundas Gauge for .NET)

时间:2017-10-09 14:45:10

标签: mono dundas

在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运行时?

1 个答案:

答案 0 :(得分:0)

Mono只是一个基于Microsoft发布标准的开源MSIL运行时。因此,如果混淆的程序集(就像你遇到的那个)使用一些特定于.NET Framework的技巧(这很常见并且通常是混淆器昂贵且有效的原因),Mono将无法执行它,因为这违背了Mono的设计(在某些情况下,标准合规性比与.NET Framework的兼容性更重要)。

因此,在您的情况下,您只能返回.NET Framework和Windows。如果您阅读最终用户许可协议,那么第三方程序集的许可也是必需的。

顺便说一句,Dundas不仅受欢迎,而且后来被微软收购,成为了.NET Framework内置组件。单声道人试图克隆它,但他们太忙于其他事情,所以子项目没有完成,

https://github.com/mono/mono/tree/master/mcs/class/System.Windows.Forms.DataVisualization/System.Windows.Forms.DataVisualization.Charting