代码之家  ›  专栏  ›  技术社区  ›  ElektroStudios

无法通过反射加载特定的32位程序集

  •  1
  • ElektroStudios  · 技术社区  · 7 年前

    我在用图书馆 SharpShell 要开发简单的外壳扩展(属性表)以显示.NET程序集的某些信息,请参见:

    enter image description here

    这个外壳扩展和 锐壳 它本身与这个问题无关,而是为了解释我的情况,以便你能更好地理解我的问题。


    我的项目编译为 任何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

    1 回复  |  直到 7 年前
        1
  •  0
  •   NineBerry    7 年前

    无法使用 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);
    

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

    推荐文章