您的位置:首页 > 编程语言 > VB

VB.Net程序设计:Excel开发释放资源问题(非杀死Excel进程)

2014-01-08 18:58 633 查看
很久很久以前就遇到过这个问题。也找到了解决的方法,就是忘记代码是怎么写的,在哪里。

最近也遇到过。只能通过搜索代码,看看代码是怎么写的。

印象中,解决的方法是有掉用System.GC.Collect(),还有说调用这个要和包含有Excel对象的函数分开。

庆幸的是代码里面有记录下方法的来源是:http://bbs.csdn.net/topics/70360199

下面是自己调用的代码:

Private Sub BtnWrite2File_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnWrite2File.Click
‘...
Select Case Path.GetExtension(My.Settings.strWriteFilePath).ToLower
Case ".txt"
Write2Text()
Case ".xls"
'參考http://topic.csdn.net/t/20050531/16/4049025.html 18樓
Write2Excel()
'否則無法釋放excel資源。
System.GC.Collect()
System.GC.WaitForPendingFinalizers()
Case ".xml"
Write2Xml()
End Select
End Sub


而新项目的代码是在一个多线程中调用Excel的,释放方法采用下面方法,仍然无效。仍然需要测试

Dim th As New Threading.Thread(AddressOf Me.ExportDgv2ExcelFile)
th.IsBackground = True
th.Start()

Private Sub ExportDgv2ExcelFile()
'创建xlApp程序

releaseObject(xlApp)

End Sub

Private Sub releaseObject(ByVal obj As Object)
Try
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
obj = Nothing
Catch ex As Exception
obj = Nothing
Finally
GC.Collect()
End Try
End Sub


--------------------------------

来源记录:

1.设置权限

   在 开始->运行 中输入dcomcnfg 回车 会弹出 分布式COM配置属性 窗口

   在 应用程序中选择 Microsoft Excel 然后点击属性

   在 常规--身份验证级别 中选 无

   在 安全性 中选择 使用自定义访问权限, 点编集 ,加入用户asp.net

   在 身份标识 中选择交互式用户

点击确定返回

2.使用垃圾回收

        GC.Collect();

        GC.WaitForPendingFinalizers();

注意:这两个语句不能和excel对象在同一函数中

可以这样写:

private void useExcel()

{

   ....使用excel;

}

private void Button2_Click(object sender, System.EventArgs e)

{

  useExcel();

  GC.Collect();

  GC.WaitForPendingFinalizers();   

}

忘说了,程序中,如果象上面说的那样做的话

下面释放com的语句根本不需要了

System.Runtime.InteropServices.Marshal.ReleaseComObject(UsedRange);

垃圾回收会释放所有资源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: