2014-04-21 48 views
2

我有一个语言编译器,我刚刚更新了目标.NET 4.0,并且框架程序集的元数据生成器现在在System.Data.dll上失败,而所有其他工作正常(mscorlib,系统等)System.Data.dll上的系统程序集.NET上的.NET反射失败

元数据生成器只是简单地加载程序集,反映所有类型和成员信息,并生成语言的存根类。

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

无法加载文件或程序集“文件:/// C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319 \ System.Data.dll' 或它的一个依赖关系。试图加载一个格式不正确的程序 。

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

+2

我几个月前有这个问题,这个环节帮我: http://jepsonsblog.blogspot.co.il/2010/12/could-not-load-file-or-assembly.html 你碰到这个了吗? –

+1

根据谷歌“试图加载格式不正确的程序”,例如http://blogs.msdn.com/b/arvindsh/archive/2009/06/21/tip-of-the-day-an-attempt-was-made-to-load-a-program-with-an-不正确的format-net-p-invoke-issue.aspx它似乎是32位和64位的问题。不知道大约64位,但在我的情况下,总是需要标记EXE调用..Load为x86,以便它只加载32位库。应该可以使用Mono.Cecil – xmojmr

+0

同时加载32位和64位。这是解决它。我可以使用x86 for colastub,因为它被称为子进程并将元数据作为文本返回。我的实际需求是从.NET程序集访问类型元数据,这样我就可以将它们公开为可乐类。我可以考虑Mono.Cecil。它是用.NET自己编写的,还是本地C/C++?不幸的是,我在10年前开始使用可口可乐编译器作为业余爱好,当时我在使用C++作为我的主要语言之前,在Mono存在之前,现在我很遗憾没有用C#编写它。我希望能够直接访问CLR程序集而不使用存根程序。 – codenheim

回答

2

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

因此,组件的构建方式不同,您不应该期望反射适用于所有人。 System.Data.dll似乎是一个混合模式的程序集,总是与位相关。

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

+0

谢谢,将应用切换到x86可以解决问题。这可以作为x86运行,因为它是一个存根生成器,编译器作为子进程运行以读取类型元数据。谢谢! – codenheim