【问题标题】:Unknown Exception when using .NET 4.5 and Mixed Assemblies使用 .NET 4.5 和混合程序集时出现未知异常
【发布时间】:2012-12-11 11:33:54
【问题描述】:

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

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

最好的问候

迈克尔

【问题讨论】:

    标签: c++ .net command-line-interface mixed


    【解决方案1】:

    我会查看最初引发的异常 - 这应该可以让您了解为什么代码在 .NET Framework 4.5 下无法运行。

    【讨论】:

    • 您好,感谢您的建议。由于 catch 块位于平面本机代码中,因此我无法捕获任何托管异常。不幸的是,通过的异常不是 std::exception。知道我应该抓住什么吗?迈克尔
    • 如果存在某种根异常(如 .NET 中的异常),我会尝试捕捉它。您也可以尝试捕获(我认为)System.ComponentModel.Win32Exception。
    • 很遗憾,原生 c++ 中没有任何根异常。
    【解决方案2】:

    最后我自己解决了这个问题。由于 .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)”进行动态转换

    最好的问候

    迈克尔

    【讨论】:

      猜你喜欢
      • 2012-11-28
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      相关资源
      最近更新 更多