2012-12-11 50 views
1

安装新的.Net Framework(版本4.5)时出现问题。我正在研究通过本机代码访问的插件程序集。该库是使用Visual Studio 2010和.NET 4.0作为目标平台构建的。使用.NET 4.5和混合程序集时出现未知异常

以下代码片段在.NET 4.5中引发异常,并且在.NET 4.0中正常工作。任何想法如何解决这个问题?

#pragma managed(push, off) 
#pragma managed(push, on) 

static bool ManagedTestFunction() { 
    return false; 
} 

#pragma managed(pop) 

static void CheckIfManagedUnmanagedTransitionIsPossible() 
{ 
    try 
    { 
     ManagedTestFunction(); 
    } 
    catch (...) 
    { 
     throw misc::mwException(0, _T("The program is not working if .NET Framework 4.5 is installed. Please revert to previous version .NET 4.0!")); 
    } 
}; 

问候

迈克尔

回答

0

我想看看有什么异常最初被抛出 - 这应该给你一个线索,为什么代码不会在.NET框架4.5的工作。

+0

嗨, 感谢您的建议。由于catch块处于平面本机代码中,因此无法捕获任何托管异常。不幸的是,通过的例外是没有std :: exception。任何想法我应该赶上? Michael – BikingGlobetrotter

+0

如果有某种根异常(如.NET中的Exception),我会试着去捕捉它。你也可以尝试捕捉(我认为)System.ComponentModel.Win32Exception。 –

+0

不幸的是,原生C++没有任何root异常。 – BikingGlobetrotter

0

终于我自己解决了这个问题。这可能是由于.NET 4.5中的一些优化造成的概念问题。海外商品会有下面的例子:

// managed class 
ref class A 
{ 
} 

// native class holding a reference to A 
class B 
{ 
    msclr::gcroot<A^> m_refA; 
}; 

当第一次穿越本地管理界面,新的.NET Framework尝试解决所有托管类型是在本地类参考他们的独立是否实际使用与否。那时候,还不可能订阅AppDomain.ResolveAssembly事件。如果框架无法解析类型,则会发生崩溃。

一种可能的解决方案是修改的B类,使得其存储基准的系统::对象^代替并使用“cli_safe((系统:对象^)m_refA)”

此致

动态投

Michael

相关问题