我試圖抓住一個互操作異常在我的C#代碼如何捕獲Interop異常?
IEngine engine = null;
try
{
engine = engineLoader.GetEngineObject(AbbyySdkSerialNumber);
}
catch(System.Runtime.InteropServices.COMException ex)
{
int i = 0;
}
,但它並不想跳進catch塊。有任何想法嗎?先謝謝你!
我試圖抓住一個互操作異常在我的C#代碼如何捕獲Interop異常?
IEngine engine = null;
try
{
engine = engineLoader.GetEngineObject(AbbyySdkSerialNumber);
}
catch(System.Runtime.InteropServices.COMException ex)
{
int i = 0;
}
,但它並不想跳進catch塊。有任何想法嗎?先謝謝你!
的CLR自動映射從COM的HRESULT互操作,以更具體的託管異常,不到收到COMException。例如,E_ACCESSDENIED變爲UnauthorizedAccessException,E_OUTOFMEMORY變爲OutOfMemoryException等等。
如果HRESULT是一個自定義結果,或者它對於CLR是未知的,那麼運行時確實會將一個通用的COMException傳遞給客戶端。 COMException的ErrorCode屬性包含HRESULT值。
有關COM互操作的完整討論,請參閱Advanced COM Interoperability。
請注意,如果您正在VS調試器下運行此操作,那麼默認情況下執行將停止在導致異常的行上。它不會跳到catch塊,除非您繼續下一行。
上面的鏈接已過時 - 我在這裏找到Advanced Com Interop:https://msdn.microsoft.com/en- us/library/bd9cdfyx(v = vs.100).aspx – holtavolt 2017-10-05 13:32:49
@holtavolt:非常感謝 - 我修復了陳舊的鏈接。 – RoadWarrior 2017-10-05 22:29:47
如果肯定拋出異常,那麼我敢打賭它並沒有拋出你期望的異常類型,即System.Runtime.InteropServices.COMException
。我建議爲try
增加一個catch (Exception ex)
子句,以便首先檢查我的理智,然後再檢查是被拋出的異常。
我有同樣的例外。它說我的項目ID是錯誤的 - 這應該是您在初始化期間將要插入的對象序列號。
建議: 請先檢查一下,如果您在試用期運行,那麼如果沒有過期。
我通過win服務運行SDK時出現異常。服務以本地服務啓動,並且由於無法通過GetEngineObject創建引擎對象而無法工作。 我也嘗試通過不同的用戶名(進程)創建對象GetEngineObject,但它沒有幫助。這就是爲什麼我認爲我在Visual Studio中創建控制檯應用程序的用戶名區別,在那裏我將代碼放在它上面,並在VS中以調試模式運行! (VS在我的用戶名運行)
我不知道什麼是錯的...
對於我來說,我需要趕產生異常的具體類型。 它正在代碼的託管部分中生成System.IO.IOException類型的異常,並且在我需要執行catch(IOException ^)的非託管代碼中,什麼解決了問題。 或者,即使使用catch(例外^),該例外從未被捕獲。
愚蠢的問題,但你** **錯誤? – LiverpoolsNumber9 2013-03-21 15:46:13
異常類型是否完全匹配? – asawyer 2013-03-21 15:46:17
試試你趕高級期待(Exception對象) – Jacek 2013-03-21 15:46:28