1

我正在使用库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

4

1 回答 1

0

使用Assembly.Load().

改为使用Assembly.ReflectionOnlyLoadFrom()

在以 64 位运行的简单演示应用程序中,我看到以下行为:

var lAss = Assembly.Load(File.ReadAllBytes(@"C:\Windows\Microsoft.NET\assembly\GAC_32\System.Web\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Web.dll"));
MessageBox.Show(lAss.Location);

这会引发问题中描述的异常。

var lAss = Assembly.ReflectionOnlyLoadFrom((@"C:\Windows\Microsoft.NET\assembly\GAC_32\System.Web\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Web.dll"));
MessageBox.Show(lAss.Location);

这不会引发异常并显示消息框。

于 2018-09-09T02:00:38.570 回答