【问题标题】:.NET reflection on system assemblies fails on System.Data.dllSystem.Data.dll 上系统程序集的 .NET 反射失败
【发布时间】:2014-04-21 08:30:21
【问题描述】:

我有一个语言编译器,我刚刚更新为面向 .NET 4.0,框架程序集的元数据生成器现在在 System.Data.dll 上失败,而所有其他编译器都可以正常工作(mscorlib、System 等)

元数据生成器只是加载程序集,反映所有类型和成员信息,并为该语言生成一个存根类。

我正在使用 Assembly.Load() 和/或 Assembly.ReflectionOnlyLoad()

无法加载文件或程序集 'file:///c:\windows\Microsoft.NET\framework\v4.0.30319\System.Data.dll' 或其依赖项之一。试图加载一个程序 格式不正确。

它是为“AnyCPU”构建的。我正在运行安装了 .NET 4.5 更新的 Windows 7/x64。

【问题讨论】:

  • 几个月前我遇到了这个问题,这个链接帮助了我:jepsonsblog.blogspot.co.il/2010/12/…你碰到这个了吗?
  • 根据谷歌“试图加载格式不正确的程序”,例如blogs.msdn.com/b/arvindsh/archive/2009/06/21/… 这似乎是 32 位与 64 位的问题。不知道 64 位,但在我的情况下,总是需要将调用 ..Load 的 EXE 标记为 x86,以便它只加载 32 位库。应该可以使用 Mono.Cecil 同时加载 32 位和 64 位
  • 是的,这解决了它。我可以将 x86 用于 colastub,因为它被称为子进程并将元数据作为文本返回。我的实际需要是从 .NET 程序集中访问类型元数据,以便我可以将它们公开为 Cola 类。我可以考虑 Mono.Cecil。它是用 .NET 本身编写的,还是本机 C/C++ 编写的?不幸的是,我在 10 多年前作为一种爱好开始了 Cola 编译器,当时我使用 C++ 作为我的主要语言,在 Mono 出现之前,现在我后悔没有用 C# 编写它。我希望能够在不使用存根程序的情况下直接访问 CLR 程序集。
  • +1 给大家,谢谢大家的帮助!

标签: c# .net system.reflection


【解决方案1】:

如果您使用corflags 工具分析程序集,您应该看到ILONLY: 0 用于System.Data.dll,而其他(mscorlib、System)ILONLY: 1。有关 ILONLY 的更多信息,请访问here

因此,程序集的构建方式不同,您不应期望反射对所有人都有效。 System.Data.dll 似乎是一个混合模式程序集,它始终依赖于位。 p>

如果您无法以 32 位运行您的应用程序以加载 32 位程序集,您可以考虑 @xmojmr 所说的 Mono.Cecil,如 it supports reading mixed-mode assemblies

【讨论】:

  • 谢谢,将应用程序切换到 x86 解决了问题。它可以作为 x86 运行,因为它是一个存根生成器,编译器作为子进程运行以读取类型元数据。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
相关资源
最近更新 更多