2012-12-11 53 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

相關問題