gpt4 book ai didi

.net - .NET 4.0 迁移后引用 .NET 1.0 程序集的 System.TypeLoadException

转载 作者:行者123 更新时间:2023-12-02 05:01:43 38 4
gpt4 key购买 nike

有一个项目已从 .NET 3.5 迁移到 .NET 4.0。该项目有一些对 .NET 1.0 程序集的引用,这些程序集是 COM 对象的包装器。这些 .NET 1.0 程序集和 COM 对象是外部公司的产品。项目编译,但在运行时,当软件引用那些 1.0 程序集中定义的对象时的第一个点抛出异常:

System.TypeLoadException:无法从程序集“ESRI.MapObjects2.Core,Version=2.4.1.0,Culture=neutral,PublicKeyToken=8fc3cc631e44ad86”加载结构“ESRI.MapObjects2.Core.ShapeTypeConstants”。

该结构被标记为符合类型等效条件,但它有一个静态或非公共(public)字段。实际的“结构”是一个枚举,在 Reflector 中它看起来像这样:

[Guid("B027CAB1-6908-11D2-AF98-006097DA3688")]
公共(public)枚举 ShapeTypeConstants
{
moShapeTypeEllipse = 0x1a,
moShapeTypeLine = 0x16,
moShapeTypeMultipoint = 0x18,
moShapeTypePoint = 0x15,
moShapeTypePolygon = 0x17,
moShapeTypeRectangle = 0x19
}

内部异常为空。我可以看到 0x80131522 (-2146233054) 的 HRESULT,这意味着 COR_E_TYPELOAD。我不认为我缺少任何 native dll 或程序集,因为我们的 .NET 工作正常(并且它使用相同的代码、相同的引用)。

如何解决这个异常?是否有一种简单的方法,例如在 dll 的配置文件中指定 requiredRuntime 或在 csproj 的引用部分中指定 requiredTargetFramework?

最佳答案

如果环境不好,那我也可以玩。

如果我们看一下实际的错误消息,它会提示“结构”中的“静态或非公共(public)”字段。所谓的结构体其实就是枚举。看似 COM 层上的包装器枚举。还有几十种不同的包装器枚举,每个值都是明确指定的。每个枚举还包含一个名为“value__”的私有(private)整型变量。更具体地说,它看起来像这样:.field private specialname rtspecialname int32 value__

那么我们为什么不直接将它们公开:

  1. 使用 ildasm 反汇编源代码。
  2. 将 private 范围限定符替换为 public(如果我没记错的话:替换了 49 个位置)。
  3. 最后,我使用修改后的 IL 中的 ilasm 编译了一个 dll。

瞧!生成的 dll (ESRI.MapObjects2.Core.dll) 为 311.296 字节,而原始文件的长度为 323.584 字节,这让我仍然有些怀疑。但是,如果我用修改过的 dll 覆盖 GAC 中的原始 dll,一切正常,我们的软件不再崩溃。我无法确认一切都 100% 有效,因为我并不真正了解我们软件的 GIS 部分。但到目前为止我设法得到的是好的。什么可以让某人担心:如果公共(public)变量的存在会改变任何结构布局,它可能会导致枚举值的移动,或其他混淆。但希望它不会混淆任何东西。这是一个快速的 hack,在生产中,它需要在安装 MapObjects42 后覆盖 GAC 中的 ESRI.MapObjects2.Core.dll。叹。所以我不一定会建议任何人,但它似乎有效,它给了我一些满足感,一种报复的感觉。一天结束时,黑客给了我一点快乐。

关于.net - .NET 4.0 迁移后引用 .NET 1.0 程序集的 System.TypeLoadException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15748509/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com