圖 2 通過 CCW 進行的 .NET 調用
為了解該方案對于晚綁定客戶端失敗的原因,我將演練從晚綁定 COM 客戶端進行的托管方法調用。.NET 方法調用是通過由 asp.dll 承載的腳本引擎(VBScript 或 JScript_)中的晚綁定啟動的。這會導致在 CCW 上調用 IDispatch::Invoke(傳遞一個 EXCEPINFO 結構)。接下來,CCW 調用托管對象上的實際托管方法。在我們的方案中,該方法會引發異常。CCW 捕捉該異常并調用 SetErrorInfo 來存儲該異常的信息。IDispatch::Invoke 的實現看到發生了異常,并且調用 GetErrorInfo 以檢索它填充 EXCEPINFO 結構所需要的信息。由于 GetErrorInfo 清除了錯誤信息,因此當 IDispatch::Invoke 返回時,.NET 異常會丟失。該過程在圖 2 中進行了概述。
返回頁首
解決辦法
使異常得以發布的一種解決辦法是修改托管代碼組件中的所有屬性/方法,以捕捉所有類型的異常,并且在重新引發之前發布它們:
public void DoSomethingUseful()
{
try
{
... // Do some useful work
}
catch(Exception exception)
{
文章來源于領測軟件測試網 http://www.kjueaiud.com/