我們有一個正在更新的大型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和管理/本地邊界之前沒有處理
其他信息:外部組件發生異常。
有沒有辦法在不重寫大量代碼的情況下工作?
謝謝。從簡短的註釋
一般來說:你應該*不* ** **編譯**這些/ clr。將舊代碼與新的CLR代碼分開,只需使用/ clr編譯新代碼,直接編譯舊代碼/文件即可。您仍然可以在啓用了clr的DLL中將所有內容鏈接在一起。 –
感謝您的反饋,我相信您是正確的。這是我應該知道的嗎?我花了很多時間尋找這個*解決方案*。 – user2454186
應該知道嗎?我不敢說。這是我個人在經過幾次迭代後才「得到」的東西。就我個人而言,我只使用/ clr的東西來粘貼代碼,但你的情況似乎稍微複雜一些。 –