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主要是作爲一個相當強大的制膠,比你應該瞄準爲全面應用堆棧。

相關問題