我正在使用库SharpShell开发一个简单的 shell 扩展(属性表)来显示 .NET 程序集的一些信息,请参阅:
这个 shell 扩展和SharpShell本身与这个问题无关,而是解释我的场景,以便您更好地理解我的问题。
我的项目被编译为任何 CPU模式,然后,为了在我的程序中管理 x86、x64 和任何 CPU 程序集的加载,我正在使用将Assembly.Load()
原始程序集的字节作为唯一参数的函数的重载:
Assembly asm = Assembly.Load( File.ReadAllBytes(filepath) );
我使用 x86 和 x64 架构的 dll 和可执行文件对其进行了测试,并且任何 CPU 都可以正常工作……除了我将解释的问题。
问题是由于某种原因我忽略了它不适用于某些 x86 程序集,例如当我尝试加载 x86 程序集时:System.Web.dll ( System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
),该Assembly.Load()
函数引发异常。它不是 a BadImageException
,它FileLoadException
带有以下错误消息:
无法加载文件或程序集“System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。给定的程序集名称或代码库无效。(来自 HRESULT 的异常:0x80131047)
(请注意,这Assembly.ReflectionOnlyLoad()
也会引发相同的异常。)
但是,我可以成功加载同一程序集的 x64 版本。请注意,正如我所说,我可以在我的程序中加载大多数 32 位程序集。
如果我将我的项目编译为 x86,那么我可以成功加载这个程序集。但是我的项目必须编译为任何 CPU(以便能够处理 x86 和 x64 程序集的加载......因为我不知道更好的方法)。
我想知道为什么我不能加载那个特定的程序集,以及解决这个问题的可行方法。
如果你想测试它,你可以在这里下载 dll:
http://www.mediafire.com/file/8h9256w02b2j3dj/System.Web.dll.zip/file