1

我们有一个正在更新的大型MFC应用程序。它已被修改,以在一些.NET组件(一些DLL文件,现在已经成功&本地类的)添加,这个想法是,旧的代码将被淘汰最终/clr MFC应用程序中的异常处理(使用/ EHa编译)

该应用程序具有与出口本地C++类许多DLL和应用程序使用的。

在试图测试应用程序时,我们现在发现任何异常似乎会导致应用程序崩溃,即使这些异常理论上被捕获在相同的函数中。

例如:

CString AddressClass::GetPostalAddress() 
{ 
    CString address; 
    try { 
     address = (LPCSTR)(_bstr_t)m_pCommand->GetParameters()->Item["PostalAddress"]->Value; 
    } 
    catch (_com_error&)//exception occurs if postal address is NULL 
    { 
     address = _T(""); 
    } 
    return address; 
} 

使用/ clr和/ EHA(Vs2015更新3)进行编译时,_com_error不被抓住。没有/ clr它工作正常,并已运作多年。从我看过的文档中,我了解到这是应该工作的,但显然我错了。

负责产生错误的代码在comutil.h:

inline void CheckError(HRESULT hr) 
{ 
    if (FAILED(hr)) { 
     _com_issue_error(hr); 
    } 
} 

从调试器的信息是:

类型 'System.Runtime.InteropServices.SEHException' 的例外发生在XXX.dll和管理/本地边界之前没有处理

其他信息:外部组件发生异常。

有没有办法在不重写大量代码的情况下工作?

谢谢。从简短的注释

+1

一般来说:你应该*不* ** **编译**这些/ clr。将旧代码与新的CLR代码分开,只需使用/ clr编译新代码,直接编译旧代码/文件即可。您仍然可以在启用了clr的DLL中将所有内容链接在一起。 –

+0

感谢您的反馈,我相信您是正确的。这是我应该知道的吗?我花了很多时间寻找这个*解决方案*。 – user2454186

+0

应该知道吗?我不敢说。这是我个人在经过几次迭代后才“得到”的东西。就我个人而言,我只使用/ clr的东西来粘贴代码,但你的情况似乎稍微复杂一些。 –

回答

0

答案,因为它似乎有帮助:

一般来说:你应该编译这些使用/ clr。将旧代码与新的CLR代码分开,只需使用/ clr编译新代码,直接编译旧代码/文件即可。您仍然可以在启用了clr的DLL中将所有内容链接在一起。

我们要做的是在单独的静态LIB项目中编译所有原生的东西,然后将它们链接到启用了/ clr的项目中 - 在一个项目中为单个源文件分别编译开关总是有点混乱。但是,这可能仍然是您的选择。我想,取决于混合和调用模式。

我补充一点,我查看/ CLR主要是作为一个相当强大的制胶,比你应该瞄准为全面应用堆栈。

相关问题