この機能を持つ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();
});