Assembly.LoadFile()抛出关于缺少清单的异常

5

异常信息如下:

预期模块应包含程序集清单。 (HRESULT 异常: 0x80131018)

这个异常出现在以下代码行:

Assembly lvAssembly = Assembly.LoadFile(aPathFileName); 

被加载的文件是由另一个应用程序生成的插件。 如果我将插件的目标框架版本从4.0更改为3.5并重新编译,则插件可以正常加载。我不明白为什么Assembly.LoadFile方法会关心插件编译的.NET框架版本。 将加载插件的应用程序的目标框架更改为4.0也没有帮助。

你的 aPathFileName 是否指向“真正”的 .NET 程序集(而不仅仅是 Win32 DLL)? - Alexander Beletsky
1个回答

7
你的问题中的第一部分是期望的结果,CLR版本2无法加载.NET 4.0程序集,因为元数据格式已经改变。
最后一段比较难解释。这可能与使用LoadFile()有关,这是一种非常糟糕的加载程序集的方法。一个可能的故障模式是您的插件程序集可能仍然引用了2.0程序集。当它引用另一个针对早期框架编译的程序集时,这很正常。通常,这是由程序集加载器默默解决的,它只是用相应的4.0引用替换2.0引用。
您可以通过ildasm.exe验证此理论,在插件程序集上运行它,并查看.manifest文件中的.assembly指令。版本号很容易看到,你会得到类似于...的东西。
.assembly extern mscorlib as mscorlib_2
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) 
  .ver 2:0:0:0
}

始终支持使用Assembly.LoadFrom()。


我运行了ildasm.exe并得到了你展示的相同结果。这是否意味着我不能在我的插件中引用任何2.0程序集? - scott
哇,心灵调试得分一。同时重建相关程序集。或者使用LoadFrom()。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接