如果情况艰难,那我也可以强硬起来。
如果我们看一下实际的错误信息,它抱怨了“结构体”中的“静态或非公共”字段。所谓的结构实际上是一个枚举。看起来是COM层上的包装枚举。有数十个不同的包装枚举,每个值都是明确指定的。每个枚举还包含一个名为“value__”的私有int变量。更具体地说,它看起来像这样:.field private specialname rtspecialname int32 value__
那么为什么我们不直接将它们设为公共:
大功告成!生成的dll(ESRI.MapObjects2.Core.dll)大小为311.296字节,而原始文件长达323.584字节,这让我仍然有点怀疑。但是如果我用修改后的dll覆盖GAC中的原始dll,一切都能正常工作,我们的软件不再崩溃。我无法确认所有功能是否100%正常,因为我不太了解我们软件的GIS部分。但是到目前为止,我所做的还可以。 可能会让人担心的是:如果公共变量的存在会改变任何结构布局,它可能会导致枚举值的移位或其他混乱。但希望它不会搞乱任何东西。这只是一个快速的hack,在生产环境中需要在MapObjects42安装后覆盖GAC中的ESRI.MapObjects2.Core.dll。唉。 所以我不一定建议任何人这样做,但它似乎有效,并给了我一些满足感,一种复仇的感觉。黑客行为让我在一天结束时感到一点幸福。
我认为他的方法可以推广到其他类似的情况:“应用程序<->供应商.NET包装器<->供应商COM对象”。不幸的是,在我们的情况下,这种方法可能并不容易,因为我们不仅在应用程序中托管了一个COM控件,而且在我们软件的其他模块中还具有导入和导出功能以及其他分散的东西。因此,我不能只引用GUI COM组件,我只需要在其他地方使用一些核心功能。但我想分享这个发现,它可能对其他人有所帮助。我百分之百确定,MapObjects2和我们的应用程序不会是唯一的受害者。随着更多的项目迁移到.NET 4.0并仍然拥有一些旧的遗留负担,可能会面临这种情况。
TypeLoadException
的InnerException
是什么? - Shani Elharrar