在.net 4.0应用程序中加载.net 4.0程序集,而2.0正常工作
本文关键字:net 常工作 工作 应用程序 加载 程序集 | 更新日期: 2023-09-27 18:12:44
我有一个。net 4.0 32位(x86)桌面应用程序,其中有以下文件,其中一个是从用托管c++编写的包装器库调用的遗留非托管库。
- Application.exe (c#, .net 4)
- Library.dll (c#, .net 4) UnmanagedWrapper.dll (managed 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()
来查找在库中实现特定接口的类型。由于库引用了非托管包装器,因此此时将加载它。在许多机器上运行这个(所有Win 7 Pro x64机器),我得到不同的结果:在一些机器上,它抛出一个ReflectionTypeLoadException
,抱怨UnmanagedWrapper.dll或它的一个依赖不能加载。
它在其他机器上运行得很好。不管包装器库是2.0还是4.0,它都可以工作的机器与只有包装器库是2.0才能工作的机器之间有什么区别?到目前为止我唯一的线索就是安装了VS 2010的机器似乎可以工作,而只安装了。net(4.0.30319)的机器将会看到异常。这说明了什么?
在这种情况下,应用程序不能在安装Visual Studio的地方工作,偶尔的解决方案是需要安装Visual Studio Runtime。尝试安装Microsoft Visual c++ 2008 Redistributable Package (x86)或Microsoft Visual c++ 2010 Redistributable Package (x86),如果它可以工作,请确保它是您部署策略的一部分。