2017-10-09 181 views
2

在Windows中使用.NET 2.0运行时运行良好的控制台应用程序在Mono运行时中执行时会引发System.InvalidProgramException。System.InvalidProgramException:移动第三方.NET组件时出现无效的IL代码(Dundas Gauge for .NET)

该应用程序使用传统的第三方组件 - 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 

很显然,我们在第三方的代码存在问题 - 构造 - 而我没有控制权。

其他细节:

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

  • 我试图在Windows上运行的单本使用多个版本编译(单声道5.2.0.224 x64,Mono 3.12.1 x32)和FreeBSD(Mono 4.8.1 amd64)。

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

  • 第三方组件是一个32位版本。

  • 使用ILDasm进行检查时,第三方组件似乎被模糊处理。

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

回答

0

单声道只是一个开源的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

+0

我有没有指定运行时也不操作系统最初的登打士仪表执照上它必须运行。请注意,此组件是在Microsoft收购Dundas IP之前购买的。 –

相关问题