使用 .NET 4.5 和混合程序集时出现未知异常



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

以下代码片段在 .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!"));
    }
};

此致敬意

迈克尔

我会看看最初抛出的异常 - 这应该给你一个线索,为什么代码在.NET Framework 4.5下不起作用。

最后我自己解决了这个问题。由于 .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,使其存储对 System::Object^ 的引用,并使用 "cli_safe((System::Object^) m_refA)" 动态强制转换

此致敬意

迈克尔

最新更新