这个例外是什么?

时间:2010-05-11 13:08:39

标签: .net exception com interop

我在c#中读取excel表中的形状时遇到此异常: 在

的代码行上
if (worksheet.Shapes.Count >= iCurrentRowIndex)
{ }
  

无法转换类型的COM对象   'System .__ ComObject'到接口类型   'Microsoft.Office.Interop.Excel._Worksheet'。   此操作失败,因为   QueryInterface调用COM   与IID接口的组件   '{000208D8-0000-0000-C000-000000000046}'   由于以下错误而失败:   应用程序称为接口   被编组为一个不同的线程。   (HRESULT的例外情况:0x8001010E   (RPC_E_WRONG_THREAD))。

编辑:

此应用程序在本地运行完美,但当我在IIS上部署它时,它会抛出异常。应该是什么原因?我使用代码作为线程

string strImageSavedPath = string.Empty;
ThreadStart cbThreadStater = delegate { strImageSavedPath =  CopyToClipBoard(worksheet, (int)iRowindex, strApplicationPath); };
Thread thrd = new Thread(cbThreadStater);
thrd.SetApartmentState(ApartmentState.STA);
thrd.Start();
thrd.Join(); 

其中CopyToClipBoard方法读取提供的行索引的图像,将图像保存在文件系统中并返回路径。

  

System.InvalidCastException未处理Message =“无法投射   接口类型为'System .__ ComObject'类型的COM对象   'Microsoft.Office.Interop.Excel._Worksheet'。此操作失败   因为QueryInterface调用COM组件的接口   由于IID'{000208D8-0000-0000-C000-000000000046}'失败了   以下错误:应用程序调用了一个接口   为不同的线程编组。 (HRESULT的例外情况:0x8001010E   (RPC_E_WRONG_THREAD))。“Source =”Microsoft.Office.Interop.Excel“
  堆栈跟踪:          在Microsoft.Office.Interop.Excel._Worksheet.get_Shapes()          在KGD6ExcelReader.ExcelManager.CopyToClipBoard(工作表工作表,Int32 iRowindex,String strApplicationPath)中   d:\ ParallelMinds \共享\ KGD6ExcelReader \ KGD6ExcelReader \ ExcelManager.cs:线   522          在KGD6ExcelReader.ExcelManager。<> c__DisplayClass3.b__0()   在   d:\ ParallelMinds \共享\ KGD6ExcelReader \ KGD6ExcelReader \ ExcelManager.cs:线   376          在System.Threading.ThreadHelper.ThreadStart_Context(对象状态)          在System.Threading.ExecutionContext.runTryCode(Object userData)          在System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode)   代码,CleanupCode backoutCode,Object userData)          在System.Threading.ExecutionContext.RunInternal(ExecutionContext   executionContext,ContextCallback回调,对象状态)          在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态)          在System.Threading.ThreadHelper.ThreadStart()InnerException:

3 个答案:

答案 0 :(得分:1)

代码是否在后台线程上运行?如果是这样,您需要将线程的ApartmentState设置为STA - 您必须新建一个实际的线程来执行此操作并调用SetApartmentState方法。

more on that

答案 1 :(得分:1)

您尝试使用的COM接口参考(可能是工作表)是与当前线程位于不同公寓的代理。请参阅link text

尝试编组对当前线程的引用。

答案 2 :(得分:1)

使用IIS中的Office自动化对象不推荐不受支持。因此,您的应用程序在本地成功运行,而在IIS上运行失败这一事实并非完全出乎意料。

  

Microsoft does not currently recommend, and does not support, Automation of Microsoft Office applications from any unattended, non-interactive client application or component (including ASP, ASP.NET, DCOM, and NT Services), because Office may exhibit unstable behavior and/or deadlock when Office is run in this environment.

这并不意味着您无法尝试,但在继续操作之前,请确保您了解“Considerations for server-side Automation of Office”支持文章中的所有内容。