我在用图书馆
SharpShell
要开发简单的外壳扩展(属性表)以显示.NET程序集的某些信息,请参见:
这个外壳扩展和
锐壳
它本身与这个问题无关,而是为了解释我的情况,以便你能更好地理解我的问题。
我的项目编译为
任何CPU
然后,为了管理程序中x86、x64和任意CPU程序集的加载,我使用了函数的重载
Assembly.Load()
将原始程序集的字节作为唯一参数:
Assembly asm = Assembly.Load( File.ReadAllBytes(filepath) );
我用dll和x86和x64体系结构的可执行文件测试了它,任何CPU,它都工作得很好。。。除了我要解释的问题。
问题是,由于某种原因,我忽略了它对某些x86程序集不起作用,例如,当我尝试加载x86程序集时:
系统.Web.dll
(
System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
),和
程序集.Load()
函数引发异常。它不是
BadImageException
,是一个
FileLoadException
出现此错误消息:
无法加载文件或程序集“System.Web,Version=4.0.0.0,
区域性=中性,PublicKeyToken=b03f5f7f11d50a3a'或其一个
依赖关系。给定的程序集名称或代码基无效。
(HRESULT的异常:0x80131047)
(注意
Assembly.ReflectionOnlyLoad()
也将抛出相同的异常。)
但是,我可以成功加载同一程序集的x64版本。请注意,正如我所说,我可以在程序中加载大多数32位程序集。
如果我将项目编译为x86,则可以成功加载此程序集。但我的项目必须编译为任何CPU(以便能够处理x86和x64程序集的加载…因为我不知道更好的方法)。
我想知道为什么我不能加载那个特定的程序集,以及解决这个问题的可行方法。
如果要测试,可以在此处下载dll:
http://www.mediafire.com/file/8h9256w02b2j3dj/System.Web.dll.zip/file