/ clr MFC应用程序中的异常处理(使用/ EHa编译)

时间:2017-08-09 01:36:01

标签: c++ visual-studio exception-handling command-line-interface

我们有一个正在更新的大型MFC应用程序。它已被修改为添加一些.NET组件(一些DLL现在有托管和本机类),其想法是旧代码将逐步淘汰最终

该应用程序有许多DLL,其中导出了本机C ++类,并由应用程序使用。

在尝试测试应用时,我们现在发现 ANY 异常似乎会导致应用崩溃,即使这些异常在理论上被捕获在同一个函数中。

示例:

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 个答案:

答案 0 :(得分:0)

从简短评论中回答,因为它似乎有所帮助:

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

我们所做的是在单独的静态LIB项目中编译所有本机内容,然后将这些内容链接到/ clr启用项目 - 在一个项目中为单个源文件分别编译开关总是有点令人困惑。但是,它可能仍然是你的方式。我猜,取决于混合和调用模式。

我将补充一点,我认为/ clr主要是一个相当强大的胶水系统,而不是你应该为完整的应用程序堆栈定位的东西。