昨天調試函數時出現這個問題
引發類型為“System.ExecutionEngineException”的異常。
函數原型為:
public struct CDMLASTDISPENSE
{
public byte last_cmd; // Command last sent
public byte last_error_cd; //Error code last occurred
public byte last_cbx; //Cassette box last operated
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] last_dispense_count; //Dispensed count
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] last_divert_count; //Diverted count
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] last_pick_count; //Pick count
}
[DllImport("FlCommCDM.dll", EntryPoint = "FlCommCDM_LastDispense", CharSet = CharSet.Ansi)]
public static extern int FlCommCDM_LastDispense(ref CDMLASTDISPENSE lpResult);
調用該函數,起初調試都是成功的。結果突然電腦反應很慢,死住了,然後我強制結束程式,之後,再啟動調試報該錯。轉成release
報錯.runtime正在等待內部反應,
反正就是死活不行了。開始查是殺毒軟體的錯,然後卸了沒用。又說是系統.net受到破壞。
為此查詢了\ MSCOREE是託管程式的進入點
重新安裝了.net2.0 使用 windows clean up 卸載重新安裝了.net 2.0
還是不行。
最後仍是錯誤
點擊後程式報錯:
運行時遇到了錯誤。此錯誤的地址為 0x791c7b88,線上程 0x1194 上。錯誤碼為 0xc0000005。此錯誤可能是 CLR 中的 bug,或者是使用者代碼的不安全部分或不可驗證部分中的 bug。此 bug 的常見來源包括使用者對 COM-interop 或 PInvoke 的封送處理錯誤,這些錯誤可能會損壞堆棧
引發類型為“System.ExecutionEngineException”的異常
最後查出是byte[]的長度聲明有問題,隨改為:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] last_dispense_count; //Dispensed count
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] last_divert_count; //Diverted count
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] last_pick_count; //Pick count
已經解決,是長度引起的。
但原來為什麼沒有出錯,一直可以,是因為byte[]起初返回的值可以區分,當不能填滿第一個byte時,後面的byte【】
就無法填裝了。所以如果是最後一個byte【】資料長度不足也可以返回,但後面還跟有byte【】時,資料位元就不對整了
因此,會引發無法預知的錯誤。
過程收穫:.net2.0安裝容易,卸載很難。重裝需要安裝微軟協助裡使用window clean up 刪除檔案和註冊表。