2011-10-27 163 views
1

我有一个带有以下文件的.NET 4.0 32位(x86)桌面应用程序,其中一个是从包装程序库中调用的传统非托管库在托管的c + +。ReflectionTypeLoadException从.Net 4.0应用程序加载.Net 4.0程序集,而2.0作品

  1. Application.exe(C#,.NET 4)
  2. Library.dll(C#,.NET 4)
  3. UnmanagedWrapper.dll(托管C++)
  4. Unmanaged.dll(c)中

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

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 

在这种配置中,它的工作没有问题。然后我迁移的非托管的包装项目将在2010年建成VS在默认情况下使.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)安装的机器会看到异常。那应该告诉我什么?

回答

1

在安装了Visual Studio的应用程序无法正常工作的情况下,偶尔解决的办法是需要安装Visual Studio Runtime。尝试安装Microsoft Visual C++ 2008 Redistributable Package (x86)Microsoft Visual C++ 2010 Redistributable Package (x86),如果它能正常工作,请确保其部署策略。

+0

好的线索。应用程序可能包含VS2008 C++运行时,但不包含2010运行时。在开发机器上都可能安装,但这可以解释不同之处。我会快速检查... –

+0

这是否奏效? – luqi

+0

它比我想象的更为怪异,或者我不完全理解redists如何工作。在发生故障的机器上,它没有redist(在windows目录下)比2005更新。工作版本是用2008构建的,所以我不明白为什么它起作用?无论如何,这显然是我需要的提示,所以我只是将其标记为答案,谢谢。 –

相关问题