ReflectionTypeLoadException 从 .Net 4.0 应用程序加载 .Net 4.0 程序集,而 2.0 可以工作

Posted

技术标签:

【中文标题】ReflectionTypeLoadException 从 .Net 4.0 应用程序加载 .Net 4.0 程序集,而 2.0 可以工作【英文标题】:ReflectionTypeLoadException loading .Net 4.0 Assembly from .Net 4.0 application, while 2.0 works 【发布时间】:2011-10-27 06:41:27 【问题描述】:

我有一个 .NET 4.0 32 位 (x86) 桌面应用程序,其中包含以下文件,其中一个是从用托管 c++ 编写的包装器库调用的旧版非托管库。

    Application.exe (C#, .net 4) Library.dll (C#, .net 4) UnmanagedWrapper.dll(托管 c++) Unmanaged.dll (c)

文件 1 和 2 由 VS 2010 解决方案构建。这些标志如下所示:

Version   : v4.0.30319
CLR Header: 2.5
PE        : PE32
CorFlags  : 3
ILONLY    : 1
32BIT     : 1
Signed    : 0

非托管包装库最初是用 VS 2008 构建的,如下所示:

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 16
ILONLY    : 0
32BIT     : 0
Signed    : 0

在此配置中,它可以正常工作。然后我将非托管包装器项目迁移到在 VS 2010 中构建,默认情况下将 .NET 4 作为目标:

Version   : v4.0.30319
CLR Header: 2.5
PE        : PE32
CorFlags  : 16
ILONLY    : 0
32BIT     : 0
Signed    : 0

在Library.dll 中的一段代码中,我使用Assembly.GetExecutingAssembly().GetTypes() 来查找在Library 中实现某个接口的类型。由于库引用了非托管包装器,因此它将在此时加载。 在多台机器(所有 Win 7 Pro x64 机器)上运行它,我得到不同的结果: 在一些机器上,它会抛出 ReflectionTypeLoadException 抱怨 UnmanagedWrapper.dll 或其依赖项之一无法加载。

它可以在其他机器上完美运行。无论包装器库是 2.0 还是 4.0,它工作的机器与只在包装器是 2.0 时才工作的机器之间有什么区别?到目前为止我唯一的线索是 带有 VS 2010 的机器似乎可以工作,而只有 .NET (4.0.30319) 安装的机器会看到异常。那应该告诉我什么?

【问题讨论】:

【参考方案1】:

在安装了 Visual Studio 的应用程序无法运行的这种情况下,有时解决方案是您需要安装 Visual Studio Runtime。尝试安装Microsoft Visual C++ 2008 Redistributable Package (x86) 或Microsoft Visual C++ 2010 Redistributable Package (x86),如果可行,请确保它是您部署策略的一部分。

【讨论】:

好线索。应用程序可能包含 VS2008 c++ 运行时,但不包含 2010 运行时。在开发机器上可能都安装了两者,但这可以解释差异。我会快速检查... 这比我想象的更奇怪,或者我不完全理解 redist 是如何工作的。在它失败的机器上,它没有比 2005 更新的 redist(在 windows 目录下)。工作版本是用 2008 构建的,所以我不明白为什么它开始工作?无论如何,这显然是我需要的提示,所以我将其标记为答案,谢谢。 @AndersForsgren 在安装了 Visual Studio 的机器上可能没有显示安装了 redist,但需要的 dll 是。不确定,只是我的猜测。

以上是关于ReflectionTypeLoadException 从 .Net 4.0 应用程序加载 .Net 4.0 程序集,而 2.0 可以工作的主要内容,如果未能解决你的问题,请参考以下文章