1

安装新的 .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!"));
    }
};

此致

迈克尔

4

2 回答 2

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 类,使其存储对 System::Object^ 的引用,并使用“cli_safe((System::Object^) m_refA)”动态转换

此致

迈克尔

于 2012-12-13T09:20:46.207 回答
0

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

于 2012-12-11T11:52:01.330 回答