我有一个具有此功能的 excel 插件类:
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();
}
这会导致转换错误:
无法将“System.__ComObject”类型的 COM 对象转换为接口类型“Microsoft.Office.Interop.Excel._Workbook”。此操作失败,因为 IID 为“{000208DA-0000-0000-C000-000000000046}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:加载类型库/DLL 时出错。(来自 HRESULT 的异常:0x80029C4A (TYPE_E_CANTLOADLIBRARY))。
如果我不使用新线程,则不会发生强制转换错误。
编辑:尝试使用任务工厂,同样的错误:
var task2 = Task.Factory.StartNew(
() =>
{
Globals.BobStats.testRibbon();
});