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

Posted

技术标签:

【中文标题】System.InvalidProgramException:移动第 3 方 .NET 组件时 IL 代码无效(Dundas Gauge for .NET)【英文标题】:System.InvalidProgramException: Invalid IL code when moving 3rd party .NET component (Dundas Gauge for .NET) 【发布时间】:2017-10-09 14:45:10 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

我拥有的原始 Dundas Gauge 许可证未指定运行时或必须运行的操作系统。请注意,此组件是在 Microsoft 收购 Dundas IP 之前购买的。

以上是关于System.InvalidProgramException:移动第 3 方 .NET 组件时 IL 代码无效(Dundas Gauge for .NET)的主要内容,如果未能解决你的问题,请参考以下文章