在.net 4.0应用程序中加载.net 4.0程序集,而2.0正常工作

本文关键字:net 常工作 工作 应用程序 加载 程序集 | 更新日期: 2023-09-27 18:12:44

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

  1. Application.exe (c#, .net 4)
  2. Library.dll (c#, .net 4)
  3. UnmanagedWrapper.dll (managed c++)
  4. 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()来查找在库中实现特定接口的类型。由于库引用了非托管包装器,因此此时将加载它。在许多机器上运行这个(所有Win 7 Pro x64机器),我得到不同的结果:在一些机器上,它抛出一个ReflectionTypeLoadException,抱怨UnmanagedWrapper.dll或它的一个依赖不能加载。

它在其他机器上运行得很好。不管包装器库是2.0还是4.0,它都可以工作的机器与只有包装器库是2.0才能工作的机器之间有什么区别?到目前为止我唯一的线索就是安装了VS 2010的机器似乎可以工作,而只安装了。net(4.0.30319)的机器将会看到异常。这说明了什么?

在.net 4.0应用程序中加载.net 4.0程序集,而2.0正常工作

在这种情况下,应用程序不能在安装Visual Studio的地方工作,偶尔的解决方案是需要安装Visual Studio Runtime。尝试安装Microsoft Visual c++ 2008 Redistributable Package (x86)或Microsoft Visual c++ 2010 Redistributable Package (x86),如果它可以工作,请确保它是您部署策略的一部分。