博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正确释放WORD对象(COM组件) COMException: 被调用的对象已与其客户端断开连接
阅读量:4983 次
发布时间:2019-06-12

本文共 4073 字,大约阅读时间需要 13 分钟。

本来form method=post本页面

修改为其他页面 action=save.aspx后没问题

其他问题可参考以下:

引自:

源问题:
详细内容: 
System.Runtinm.InteropServices.COMException 
被调用的对象已与其客户端断开连接。 (异常来自 HRESULT:0x80010108 (RPC_E_DISCONNECTED)) 
ErrorCode:-2147417848 
Souce:Interop.Word 
StackTrace:" 在 Word.ApplicationClass.Quit(Object& SaveChanges, Object& OriginalFormat, Object& RouteDocument)\r\n 在 WordOPTools.OpWord(Object& fileName, Boolean issafe, String newpath)" 

当处理的word内容比较大的时候报这个异常. 
还请各位多多帮忙解决一下这个问题. 


解决方法:

object nothing=System.Reflection.Missing.Value; 
object optional=System.Reflection.Missing.Value; 
object visible=true; 
object saveChanges = true; 
object NOTsaveChanges = false; 
object docreadonly=true; 
object originalFormat = System.Reflection.Missing.Value; 
object routeDocument =System.Reflection.Missing.Value; 
Word.ApplicationClass app=new Word.ApplicationClass(); 
object Fi=page.Server.MapPath(strC+"Template_temp/"+FileName); 
Word.Document Doc=app.Documents.Open(ref Fi,ref optional,ref docreadonly,ref optional,ref optional,ref optional,ref optional,ref optional,ref optional,ref optional,ref optional, ref visible); 



Doc.SaveAs(ref strFileName,ref optional, ref optional, ref optional,ref optional, ref optional, ref optional,ref optional, ref optional, ref optional, ref optional); 
Doc.Close(ref NOTsaveChanges, ref originalFormat, ref routeDocument); 
app.Quit(ref NOTsaveChanges, ref originalFormat, ref routeDocument); 
System.Runtime.InteropServices.Marshal.ReleaseComObject(app); 
System.Runtime.InteropServices.Marshal.ReleaseComObject(Doc); 
app=null; 
Doc=null; 
GC.Collect(); 
GC.Collect();

--------------------------------------------------------------
补充
------------摘自:http://blogs.geekdojo.net/richardhsu/archive/2003/11/14/281.aspx

Working with COM Exe in C#

Credit goes to  for this one. In his article, he talks about creating dynamic excel workbooks in C# within an ASP.NET page.

What I learnt from the article was how we can properly release a COM object. There are two methods that we are gets the deallocation done. They are :-

1) GC.Collect(); // this one forces garbage collection

2) System.Runtime.InteropServices.Marshal.ReleaseComObject (object); // this one releases the passed in COM object wrapper instance

The pattern the author (Peter A. Bromberg) uses to create and release COM Wrapped Excel objects is :-

1) call GC.Collect() to force collection of existing COM Objects waiting to be released.
2) instantiate the COM Wrapped Excel objects (Workbook, Worksheet etc.)
3) do the thing... 
4) call the Close() or Quit() methods on the objects when done.
5) call System.Runtime.InteropServices.Marshal.ReleaseComObject(object) once for each COM object created.
6) set each object variable to null.
7) call GC.Collect() again
8) be relieved and reminisce the cool VB6 way of doing the above (Set obj = Nothing)

Here is a slightly altered & annotated code fragment (in C#) that shows how it is done :-

Excel.Application oXL;

Excel._Workbook oWB;
Excel._Worksheet oSheet;

// Step 1

GC.Collect();// clean up any other excel guys hangin' around...

// Step 2

oXL = new Excel.Application();
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;

// Step 3

// this part will actually be filling in the values into the sheet
fillValues(oSheet);
....

// Step 4

// Need all following code to clean up and extingush all references!!!
oWB.Close(null,null,null);
oXL.Workbooks.Close();
oXL.Quit();

// Step 5

System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);

// Step 6

oSheet=null;
oWB=null;
oXL = null;

// Step 7

GC.Collect(); // force final cleanup!

Although I am yet to fully understand what goes on behind the scenes, I have used the above mention pattern, and it works. Excel exposes its functionality through a COM Exe. Maybe, we don't need to do all this for a COM Dll, but that is for later.

Published Friday, November 14, 2003 5:08 PM by 
 

Filed Under: 

转载于:https://www.cnblogs.com/y0umer/p/3838930.html

你可能感兴趣的文章
console对象-转
查看>>
洛谷 4216 BZOJ 4448 [SCOI2015]情报传递
查看>>
清北学堂2018DP&图论精讲班 DP部分学习笔记
查看>>
css3 2D变换 transform
查看>>
Fastjson获取天气信息封装bean
查看>>
不同编码字符所占大小
查看>>
使用迭代器优化代码
查看>>
JavaScript 获取随机数
查看>>
线程学习的几个实例
查看>>
dom4j读取XML文件内容
查看>>
Java虚拟机10:Client模式和Server模式的区别
查看>>
Blog搬家吧
查看>>
2017-2018-1 20155306 20155315《信息安全系统设计基础》实验二 固件程序设计
查看>>
自定义连接池
查看>>
MySQL 索引
查看>>
应用程序不能全然结束的原因探秘及调试方法
查看>>
单元文件结构
查看>>
DOM、SAX、DOM4J、JDOM、StAX生成XML并返回XML字符串形式
查看>>
60. Permutation Sequence
查看>>
log日志 和回滚日志
查看>>