C#COM添加在从线程调用失败

我正在编写用C#编写的Excel的UDF库。 我将长期运行UDF,所以我想使UDFasynchronous,以便Excel UI在调用UDF时保持可用。 以下是我的代码; 但它从派生的线程调用Excel时失败…

[ClassInterface(ClassInterfaceType.AutoDual)] [ComVisible(true)] [ComDefaultInterface(typeof(IRAPDataAddIn))] public class RAPDataAddIn : IRAPDataAddIn { public string GetPositionData(Excel.Range Portfolios, Excel.Range Security) { Excel.Application excelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application"); Excel.Range target = (Excel.Range)excelApp.get_Caller(System.Type.Missing); Thread _workerThread = new Thread(new ParameterizedThreadStart(this.GetData)); _workerThread.CurrentCulture = System.Globalization.CultureInfo.CurrentCulture; _workerThread.CurrentUICulture = System.Globalization.CultureInfo.CurrentUICulture; _workerThread.Start(target); return "Getting Data"; } public void GetData(object Range) { Excel.Range target = Range as Excel.Range; Thread.Sleep(1000); object[,] returnData = new object[2,2]; returnData[0, 0] = " FirstThread"; returnData[0, 1] = " SecondThread"; returnData[1, 0] = " ThirdThread"; returnData[1, 1] = " FourthThread"; var Start = (Excel.Range)target.Worksheet.Cells[1,1]; var End = (Excel.Range)target.Worksheet.Cells[2,2]; Excel.Range r = (Excel.Range)target.Worksheet.Range[Start, End]; try { r.Value2 = returnData; ***//It fails here*** } catch (Exception ex) { } } 

(免责声明:我开发了Excel-DNA库)

我build议你使用(免费) Excel-DNA库来实现你的Excel UDF。 我最近添加了一些asynchronous函数的实验性支持,所以现在将是一个很好的尝试。 我在这里提供了当前asynchronous函数支持的初始大纲: http : //exceldna.codeplex.com/wikipage?title= Asynchronous% 20Functions&referringTitle=Documentation 。 Excel-DNA支持的最佳场所是Excel-DNA Google小组 。

你的方法有一些潜在的问题:

  • 您用Marshal.GetActiveObject检索的Application对象可能不是您正在运行的Excel实例。 如果更多的一个Excel实例已经启动,这将是最新的Excel启动。

  • 你不能把“范围”COM对象传递给另一个线程 – 它是一个STA公寓绑定的对象,所以不能在没有明确的跨线程编组的情况下从不是主Excel线程的线程使用。

  • 例如,如果Excel忙于计算,或者用户正在编辑单元格,或者甚至只是按下鼠标键,则Excel中的任何一个COM调用都可能失败。 因此,每个COM调用都需要处理可能的exception,作为正常操作的一部分。

有几种方法可以用Excel-DNA来实现这种工作,所以如果您需要更详细的指导,您应该查看图书馆并发布到Google小组。