我有了這個功能的Excel加載項類:當在線程中調用Excel函數時CastError?
public void testRibbon()
{
Excel.Workbook workbook = this.Application.ActiveWorkbook;
Excel.Worksheet activeSheet = workbook.Sheets[1];
Excel.Range range = activeSheet.get_Range(JOB_ID_FIELD + HEADER_ROW, TOTAL_STATUS_PERCENTAGE_KEY_FIELD + (10 + 1).ToString());
range.get_Range("C4").Value = "test Ribbon complete";
}
在我添加了一個按鈕,按下時會調用testRibbon在一個線程功能區:
private void process_Click(object sender, RibbonControlEventArgs e)
{
Thread processThread = new Thread(delegate(){
Globals.ExcelAddin.testRibbon();
});
processThread.Start();
}
這將導致鑄造錯誤:
Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Excel._Workbook'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{000208DA-0000-0000-C000-000000000046}' failed due to the following error: Error loading type library/DLL. (Exception from HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY)).
如果我不使用新線程,則不會發生轉換錯誤。
編輯:使用任務工廠試了,同樣的錯誤:
var task2 = Task.Factory.StartNew(
() =>
{
Globals.BobStats.testRibbon();
});
我不太確定我明白「並且沒有使用Start(),所以此時線程未執行」。無論如何,對這個問題適當的解決辦法是什麼? 'testRibbon()'將被一個長時間運行的函數取代,我不想捆綁excel UI,所以它必須在一個線程中。 – 2012-08-10 20:34:54
而不是思考線程,你可以像使用任務一樣使用它。它將不會崩潰當您使用Task.Factory .... – 2012-08-10 20:39:26
謝謝,我會研究。我是C#的新手,並沒有聽說過任務。 – 2012-08-10 20:47:08