正确释放WORD对象(COM组件) COMException: 被调用的对象已与其客户端断开连接
来源:互联网 发布:windows损坏文件修复 编辑:程序博客网 时间:2024/05/17 00:47
本来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 richardhsuFiled Under: Office - VBA, C#
- 正确释放WORD对象(COM组件) COMException: 被调用的对象已与其客户端断开连接
- C# Socket连接 无法访问已释放的对象
- 已创建的VPN连接,调用,断开
- 已创建的VPN连接,调用,断开
- 释放Com对象的方法.
- 对com对象的释放
- C# WinForm:无法访问已释放的对象
- 无法访问已释放的对象X.show()
- COM组件:可连接对象的VC实现
- 使用COM客户端调用.NET对象
- C# Excel com 对象的释放
- C#COM对象的资源释放问题解决
- ArcEngine中com对象的释放问题
- C#在父窗口中调用子窗口的过程(无法访问已释放的对象)
- C#,无法访问已释放的对象。对象名:“Form1”。
- 无法访问已释放的对象。 对象名:“WebBrowser”
- 编写能被com组件调用的客户端
- Word组件对象模型
- NSScanner类的基本用法
- 自考之—我看《操作系统概论》
- INFORMIX时间函数笔记
- 基于ZooKeeper构建大规模配置系统
- No rule to make target `out/target/common/obj/APPS/framework-res_intermediates/src/R.stamp
- 正确释放WORD对象(COM组件) COMException: 被调用的对象已与其客户端断开连接
- 基于Html5的兼容所有主流浏览器的在线视频播放器videoJs
- Extjs正则表达式小结
- 背景layout组合布局
- std::map find 自定义类型元素
- 安卓文件浏览器
- gradle是什么,新建工程停留在building gradle project info,gradle最新版本下载
- QTcpSocket 发送数据的几种方法
- kinect开发笔记1:openNI的配置