C# Assembly.LoadFile()引发有关缺少清单的异常

C# Assembly.LoadFile()引发有关缺少清单的异常,c#,C#,例外情况是: 模块应包含程序集清单。(来自HRESULT的异常:0x8013108) 我在电话里听到: Assembly lvAssembly = Assembly.LoadFile(aPathFileName); 正在加载的文件是由不同应用程序生成的插件。 如果我将插件的目标框架版本从4.0更改为3.5并重新编译。插件加载良好。我不明白为什么Assembly.LoadFile方法会关心插件编译的.net framework版本 将加载插件的应用程序的目标框架更改为4.0没有帮助。问题的第一

例外情况是:

模块应包含程序集清单。(来自HRESULT的异常:0x8013108)

我在电话里听到:

Assembly lvAssembly = Assembly.LoadFile(aPathFileName); 
正在加载的文件是由不同应用程序生成的插件。 如果我将插件的目标框架版本从4.0更改为3.5并重新编译。插件加载良好。我不明白为什么Assembly.LoadFile方法会关心插件编译的.net framework版本


将加载插件的应用程序的目标框架更改为4.0没有帮助。

问题的第一部分是预期结果,CLR版本2无法加载.NET 4.0程序集,元数据格式已更改

最后一段更难解释。这可能与使用LoadFile()有关,这是一种非常糟糕的加载程序集的方法。一种可能的故障模式是,插件程序集可能仍然具有对2.0程序集的引用。当它引用另一个编译为针对早期框架的程序集时,这是很正常的。这通常由程序集加载器静默解决,它只是用相应的4.0引用替换2.0引用

您可以使用ildasm.exe验证此理论,在插件程序集上运行它,并查看.assembly指令的清单。版本号很容易看到,你会得到

.assembly extern mscorlib as mscorlib_2
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) 
  .ver 2:0:0:0
}

总是喜欢Assembly.LoadFrom()。

你的aPathFileName指向“real.net Assembly”(不仅仅是win32 dll?)吗?我运行了ildasm.exe,得到了与你显示的相同的结果。这是否意味着我不能在插件中引用任何2.0程序集?哇,心理调试得1分。还要重新生成依赖程序集。或者使用LoadFrom()。