2

在 Windows 中使用 .NET 2.0 运行时运行良好的控制台应用程序在 Mono 运行时中执行时会引发 System.InvalidProgramException。

该应用程序使用遗留的第 3 方组件 - 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

显然,我们在第 3 方的代码中存在问题——一个构造函数——我无法控制它。

额外细节:

  • 这是一个使用 Visual Studio 2008 编译的 .NET 3.5 应用程序。

  • 我尝试在 Windows(Mono 5.2.0.224 x64、Mono 3.12.1 x32)和 FreeBSD(Mono 4.8.1 amd64)上使用多个版本的 Mono 来运行它。

  • 所有这些运行时都会发生相同的异常。

  • 第 3 方组件是 32 位版本。

  • 使用 ILDasm 检查时,第 3 方组件似乎被混淆了。

可以做些什么来解决这个问题并让程序在 Mono 中运行?我觉得这样一个流行的组件包含无效的 IL 有点疯狂。它怎么可能在 Microsoft 的 .NET 运行时而不是 Mono 运行时上工作?

4

1 回答 1

0

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

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

顺便说一句,Dundas 不仅流行,后来被微软收购,成为 .NET Framework 的内置组件。Mono的人试图克隆它,但是他们太忙于其他事情,以至于子项目没有完成,

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

于 2017-10-20T21:38:05.727 回答