正确释放WORD对象(COM组件) COMException: 被调用的对象已与其客户端断开连接

简介: 本来form method=post本页面 修改为其他页面 action=save.aspx后没问题 其他问题可参考以下: 引自:http://topic.csdn.net/u/20090108/17/f240cd4d-72cf-44bc-851e-cc587dd7e468.html源问题:详细内容: System.Runtinm.InteropServices.COMException 被调用的对象已与其客户端断开连接。

本来form method=post本页面

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

其他问题可参考以下:

引自:http://topic.csdn.net/u/20090108/17/f240cd4d-72cf-44bc-851e-cc587dd7e468.html

源问题:
详细内容: 
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 Peter A. Bromberg 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  richardhsu  
Filed Under:  Office - VBA C#
目录
打赏
0
0
0
0
5
分享
相关文章
pythonTCP客户端编程创建Socket对象
【4月更文挑战第6天】本教程介绍了TCP客户端如何创建Socket对象。Socket作为网络通信的基础单元,包含协议、IP地址和端口等信息。在TCP/IP中,Socket分为流式(TCP)、数据报(UDP)和原始套接字。以Python为例,创建TCP Socket对象需调用`socket.socket(AF_INET, SOCK_STREAM)`。为确保健壮性,应使用异常处理处理可能的`socket.error`。学习本教程将帮助你掌握TCP客户端创建Socket对象的技能。
【实战】使用hiredis 时怎么解决返回的查询结果和对象释放的问题
解决内存安全之后的运行结果,get 获取的value正常传出:
75 0
C++类与对象【对象的初始化和清理】
C++类与对象【对象的初始化和清理】
Hibernate的方法获取对象后,对象调用set后会自动更新数据库内容的解决办法
Hibernate的方法获取对象后,对象调用set后会自动更新数据库内容的解决办法
831 0
TimedCache 带时间缓存工具类,附加监听回调 | Java工具类
TimedCache 带时间缓存工具类,附加监听回调 | Java工具类
TimedCache 带时间缓存工具类,附加监听回调 | Java工具类
关于 C#调用C库Dll,有回调函数时,只执行一次回调函数就直接挂掉 的解决方法
关于 C#调用C库Dll,有回调函数时,只执行一次回调函数就直接挂掉 的解决方法
关于 C#调用C库Dll,有回调函数时,只执行一次回调函数就直接挂掉 的解决方法
SwiftUI—如何使用@ObservedObject监听实例对象
SwiftUI—如何使用@ObservedObject监听实例对象
832 0
AIDL的思考——asInterface判断是否为同一个进程的依据+不同进程是怎么访问到asInterface方法的
asInterface判断是否为同一个进程的依据。 由此引出我的三个问题:1)asInterface 方法的参数指的是谁;2)AMS,为什么不能直接实例化AMS然后调用其StartActivity方法呢,而是要调用 asInterface(某IBinder对象).startActivity 方法呢?3)asInterface()方法,是怎么判断出 AMS 是在不同的进程中的呢?
AIDL的思考——asInterface判断是否为同一个进程的依据+不同进程是怎么访问到asInterface方法的