我们有一个正在更新的大型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中,并且在托管/本地边界之前没有处理
其他信息:外部组件引发了异常。
无论如何都可以在不重写大量代码的情况下使用它吗?
感谢。
答案 0 :(得分:0)
从简短评论中回答,因为它似乎有所帮助:
一般来说:你应该使用/ clr 编译这些。将您的旧代码与使用新CLR的代码分开,只需使用/ clr编译新代码,直接编译旧代码/文件本机。您仍然可以在启用clr的DLL中将所有内容链接在一起。
我们所做的是在单独的静态LIB项目中编译所有本机内容,然后将这些内容链接到/ clr启用项目 - 在一个项目中为单个源文件分别编译开关总是有点令人困惑。但是,它可能仍然是你的方式。我猜,取决于混合和调用模式。
我将补充一点,我认为/ clr主要是一个相当强大的胶水系统,而不是你应该为完整的应用程序堆栈定位的东西。