C++ /clr MFC应用程序中的异常处理(使用/EHa编译)
我们有一个正在更新的大型MFC应用程序。它被修改为添加一些.NET组件(一些DLL现在有托管类和本机类),其想法是旧代码最终将被淘汰 应用程序有许多DLL,其中有本地C++类导出,并被应用程序使用。 在尝试测试应用程序时,我们现在发现任何异常似乎都会导致应用程序崩溃,即使理论上这些异常在同一个函数中被捕获 例如:C++ /clr MFC应用程序中的异常处理(使用/EHa编译),c++,visual-studio,exception-handling,command-line-interface,C++,Visual Studio,Exception Handling,Command Line Interface,我们有一个正在更新的大型MFC应用程序。它被修改为添加一些.NET组件(一些DLL现在有托管类和本机类),其想法是旧代码最终将被淘汰 应用程序有许多DLL,其中有本地C++类导出,并被应用程序使用。 在尝试测试应用程序时,我们现在发现任何异常似乎都会导致应用程序崩溃,即使理论上这些异常在同一个函数中被捕获 例如: CString AddressClass::GetPostalAddress() { CString address; try { address =
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_错误。在没有/clr的情况下,该系统运行良好,已运行多年。从我阅读的文档中,我的理解是这应该是可行的,但显然我错了
负责生成错误的代码位于comutil.h中:
inline void CheckError(HRESULT hr)
{
if (FAILED(hr)) {
_com_issue_error(hr);
}
}
来自调试器的信息如下:
XXX.dll中发生“System.Runtime.InteropServices.SEHException”类型的异常,在托管/本机边界之前未处理该异常
其他信息:外部组件引发了异常
有没有办法在不重写大量代码的情况下让它正常工作
谢谢。从简短评论中回答,因为它似乎有助于:
一般来说:您不应该使用/clr编译这些文件。使用code将旧代码与新CLR分开,只需使用/CLR编译新代码,直接编译旧代码/文件。您仍然可以在启用clr的DLL中将所有内容链接在一起 我们要做的是在单独的静态LIB项目中编译所有本机内容,然后将它们链接到启用/clr的项目中——在一个项目中为单个源文件使用单独的编译器开关总是有点混乱。但是,这可能仍然是你要走的路。我想这取决于混合和通话模式
我要补充的是,我认为/clr主要是一个相当强大的粘合系统,而不是整个应用程序堆栈的目标。从简短的评论中回答,因为它似乎有帮助:
一般来说:您不应该使用/clr编译这些文件。使用code将旧代码与新CLR分开,只需使用/CLR编译新代码,直接编译旧代码/文件。您仍然可以在启用clr的DLL中将所有内容链接在一起 我们要做的是在单独的静态LIB项目中编译所有本机内容,然后将它们链接到启用/clr的项目中——在一个项目中为单个源文件使用单独的编译器开关总是有点混乱。但是,这可能仍然是你要走的路。我想这取决于混合和通话模式
我要补充的是,我认为/clr主要是一个功能相当强大的粘合系统,而不是整个应用程序堆栈的目标。一般来说:不应该使用/clr编译它们。使用code将旧代码与新CLR分开,只需使用/CLR编译新代码,直接编译旧代码/文件。您仍然可以在启用clr的DLL中链接所有内容。感谢您的反馈,我相信您是正确的。这是我应该知道的吗?我花了很多时间寻找这个解决方案。我应该知道吗?我敢说不是。这是我个人在几次迭代后才“得到”的东西。就我个人而言,我只将/clr用于粘合代码,但您的情况似乎稍微复杂一些。使用code将旧代码与新CLR分开,只需使用/CLR编译新代码,直接编译旧代码/文件。您仍然可以在启用clr的DLL中链接所有内容。感谢您的反馈,我相信您是正确的。这是我应该知道的吗?我花了很多时间寻找这个解决方案。我应该知道吗?我敢说不是。这是我个人在几次迭代后才“得到”的东西。就我个人而言,我只在胶水代码中使用/clr,但您的情况似乎稍微复杂一些。